新闻中心
C++如何实现KMP字符串匹配算法_C++高效字符串查找算法KMP原理与实现
KMP算法通过构建next数组实现高效字符串匹配,利用最长相等前后缀信息避免主串指针回溯,在O(n+m)时间内完成搜索。

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
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
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×6实现为RTX 5090供电750W!甚至都没敢跑分
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
Pygame教程:解决用户输入与游戏状态更新不同步问题
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
韩剧圈正版入口页面_韩剧圈官网登录链接
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
12306选座怎么选到商务座_12306商务座选择与配置说明
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
GemBox Document HTML转PDF垂直文本渲染问题及解决方案


2025-11-21
浏览次数:次
返回列表
j = next[j - 1];
}
if (pattern[i] == pattern[j]) {
++j;
}
next[i] = j;
}
}