技术文摘
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算法的模板代码对于处理字符串匹配问题具有重要意义,能够帮助我们更高效地解决相关的编程任务。
- 5 个 Python 库助力轻松完成自然语言预处理
- 7 个提升 PyTorch 技能的实用小技巧及示例演示
- Rust 2021 版本计划出炉
- 数据结构之线性结构:链表
- 提升 DevTools 堆栈追踪速度 10 倍的方法
- HarmonyOS 三方件开发之 BGABadgeView 徽章组件(19)
- 一文读懂 JUC 中的 AQS 机制
- 浅析创建线程的三种基本方法
- Java 史上三次破坏双亲委派模型分别是哪些?
- Kafka 核心概念一图看懂
- 2021 年 Java 开发者应掌握的 14 项技能
- 优雅实现并发编排任务的方法
- C#中Action、Delegate和Func的用法解析
- 初探 Dubbo 一起畅玩
- 中小项目采用 ELK 处理日志?我要尝试新方法