新闻中心

C++如何实现KMP字符串匹配算法_C++高效字符串查找算法KMP原理与实现

2025-11-21
浏览次数:
返回列表
KMP算法通过构建next数组实现高效字符串匹配,利用最长相等前后缀信息避免主串指针回溯,在O(n+m)时间内完成搜索。

c++如何实现kmp字符串匹配算法_c++高效字符串查找算法kmp原理与实现

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,能够在O(n + m)时间内完成模式串在主串中的查找,避免了暴力匹配中不必要的回溯。其核心思想是利用已匹配的部分信息,通过预处理模式串构造“部分匹配表”(即next数组),跳过不可能匹配的位置。

理解KMP的核心:next数组

在KMP算法中,关键在于构建模式串的next数组,它记录了模式串每个位置之前的最长相等前后缀长度。当发生失配时,可以借助next数组决定模式串应向右滑动多少位,而无需回退主串指针。

例如,模式串 "ABABC" 的 next 数组为:
[0, 0, 1, 2, 0]

构建next数组的过程本质上是一个“模式串自我匹配”的过程,使用双指针技巧:

  • i 遍历模式串从 1 到 len-1
  • j 表示当前最长相等前后缀的长度,初始为 0
  • 若 pattern[i] == pattern[j],则 next[i++] = ++j
  • 否则回退 j = next[j-1](如果 j > 0),直到匹配或 j=0

构建next数组的代码实现

void buildNext(const string& pattern, vector<int>& next) {
    int n = pattern.length();
    next.resize(n, 0);
    int j = 0; // 最长相等前后缀的长度
    for (int i = 1; i < n; ++i) {
        while (j > 0 && pattern[i] != pattern[j]) {
            j = next[j - 1];
        }
        if (pattern[i] == pattern[j]) {
            ++j;
        }
        next[i] = j;
    }
}

KMP主匹配过程

有了next数组后,主串与模式串的匹配就可以线性进行。主串指针不回退,只移动模式串指针。

  • i 遍历主串,j 遍历模式串
  • 字符相等时,i++,j++
  • 失配时,若 j > 0,则 j = next[j-1];否则 i++
  • 当 j 达到模式串长度时,说明找到一次匹配,记录位置并继续搜索

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA
vector<int> kmpSearch(const string& text, const string& pattern) {
    vector<int> matches;
    vector<int> next;
    buildNext(pattern, next);
<pre class='brush:php;toolbar:false;'>int n = text.length();
int m = pattern.length();
int j = 0; // 模式串匹配位置

for (int i = 0; i < n; ++i) {
    while (j > 0 && text[i] != pattern[j]) {
        j = next[j - 1];
    }
    if (text[i] == pattern[j]) {
        ++j;
    }
    if (j == m) {
        matches.push_back(i - m + 1); // 记录起始位置
        j = next[j - 1]; // 继续查找下一个匹配
    }
}
return matches;

}

完整使用示例

#include <iostream>
#include <vector>
#include <string>
using namespace std;
<p>int main() {
string text = "ABABDABACDABABCABC";
string pattern = "ABABC";</p><pre class='brush:php;toolbar:false;'>vector<int> result = kmpSearch(text, pattern);

cout << "Pattern found at positions: ";
for (int pos : result) {
    cout << pos << " ";
}
cout << endl;

return 0;

}

输出结果为:
Pattern found at positions: 8
表示模式串首次出现在主串第8个位置(从0开始)。

基本上就这些。KMP的关键在于理解next数组的意义和构建逻辑,一旦掌握,匹配过程非常清晰高效。

以上就是C++如何实现KMP字符串匹配算法_C++高效字符串查找算法KMP原理与实现的详细内容,更多请关注其它相关文章!


# 不可能  # 沈阳网站建设全攻略  # 网站怎么挂上广告推广  # 滁州网站建设的基本流程  # 360网站竞价推广  # 心理网站建设工程  # 南昌营销推广流程公司  # 农旅营销品牌推广  # seo小白入门教学  # 江苏视频推广营销公司招聘  # 食堂网站如何推广文案  # 首次  # ai  # 是一种  # 边缘  # 是一个  # 关键在于  # 时间内  # 如何实现  # 游戏开发  # 遍历  # stream  # ios  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 优化Log4j2控制台输出性能:解决异步日志瓶颈  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  fishbowl官网免费版 fishbowl养鱼网站入口  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  《刺客信条:影》PS5 Pro和Switch 2画面对比  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  c++ 命名空间怎么用 c++ namespace使用指南  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  微信网页版官方快速登录入口 微信网页版网页版账号直达  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  12306怎么选座位选到安静区_12306选座安静区域选择策略  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  EMS快递官网app_中国邮政速递物流手机客户端  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  优化大型XML文件解析:基于Python流式处理的内存高效方案  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  抖音网页版怎么|直播|_抖音网页版开播操作指南  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  J*aScript:在map操作中高效处理空数组  Mac终端命令大全_Mac常用Terminal指令速查  LINUX怎么设置定时任务_LINUX crontab配置教程  CSS Box Model与弹性按钮:维持布局稳定的动画实践  如何在Promise链中优雅地中断后续then执行  C++ explicit关键字防止隐式转换_C++构造函数安全规范  抖音极速版最新版本 抖音极速版官方下载地址  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  照顾宝贝2小游戏点击立即在线玩  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  Pygame教程:解决用户输入与游戏状态更新不同步问题  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  韩剧圈正版入口页面_韩剧圈官网登录链接  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  12306选座怎么选到商务座_12306商务座选择与配置说明  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  GemBox Document HTML转PDF垂直文本渲染问题及解决方案 

搜索