技术文摘
C++ kmp算法模板代码详细解析
2025-01-01 23:51:36 小编
C++ kmp算法模板代码详细解析
KMP算法是一种高效的字符串匹配算法,在处理字符串匹配问题时具有重要的应用价值。下面我们来详细解析一下C++中KMP算法的模板代码。
KMP算法的核心在于构建一个部分匹配表(next数组)。这个数组记录了模式串中每个位置的最长公共前后缀长度。在C++代码中,计算next数组的函数通常如下:
void getNext(vector<int>& next, string pattern) {
int j = -1;
next[0] = j;
for (int i = 1; i < pattern.size(); i++) {
while (j >= 0 && pattern[i]!= pattern[j + 1]) {
j = next[j];
}
if (pattern[i] == pattern[j + 1]) {
j++;
}
next[i] = j;
}
}
在这段代码中,通过循环和条件判断不断更新j的值,从而确定每个位置的最长公共前后缀长度。
接下来是KMP算法的主函数,用于在文本串中查找模式串的出现位置:
int kmp(string text, string pattern) {
int n = text.size(), m = pattern.size();
vector<int> next(m, -1);
getNext(next, pattern);
int j = -1;
for (int i = 0; i < n; i++) {
while (j >= 0 && text[i]!= pattern[j + 1]) {
j = next[j];
}
if (text[i] == pattern[j + 1]) {
j++;
}
if (j == m - 1) {
return i - m + 1;
}
}
return -1;
}
在主函数中,首先初始化next数组,然后通过循环遍历文本串。当遇到不匹配的字符时,根据next数组调整j的值;当匹配成功时,j不断递增。如果j达到了模式串的长度减1,说明找到了匹配的位置,返回其在文本串中的起始索引。
KMP算法的时间复杂度为O(n + m),其中n是文本串的长度,m是模式串的长度。通过巧妙地利用已经匹配的信息,避免了不必要的回溯,大大提高了匹配效率。
理解和掌握KMP算法的模板代码对于处理字符串匹配问题具有重要意义,能够帮助我们更高效地解决相关的编程任务。
- Vue 组件的 8 种通信方式实例深度解析
- 高中数学中梯度下降的数学原理轻松读懂
- 2019 年五大 Java 自动化测试框架
- 前端升级指南(第一篇章)
- 一行代码带来恐惧,探索提升线上代码质量之法
- 996、小白兔与中年危机:互联网的疲态与沧桑
- Facebook 推出代码推荐工具 Aroma 重新塑造程序员职业
- 流行开发工具 bootstrap-sass 遭修改植入后门
- 互联网架构“高并发”的玩法解析
- 13 项称职 QA 经理必备的技能
- 前端进阶指南(第二部分)
- 前端:React 从 Mixin 到 HOC 再到 Hook 的深度探索
- 五款企业级 ETL 工具比较,助选项目适配方案
- 容器化进程:我的构建时间去哪了
- iOS 常见调试手段:静态分析