#include <iostream>
using namespace std;
void kmp_getnext(char *partten, int *next) {
int m = strlen(partten);
int i = 0, j = -1;
next[i] = j;
while ( i < m + 1 ) {
while ( j >= 0 && partten[i] != partten[j] ) //表示第i + 1个元素不等于第j + 1个元素
j = next[j]; //前j个字符partten[0---(j-1)]的最大前缀存放在next[j]中
i++;
j++;
next[i] = j;
}
}
void kmp_search(char *text, char *partten, int *next) {
int n = strlen(text);
int m = strlen(partten);
int i = 0;
int j = 0;
while ( i < n) {
while ( j >= 0 && text[i] != partten[j] )
j = next[j];
i++;
j++;
if ( j == m ) {
printf("%d\t", i - j + 1);
j = next[j];
}
}
}
int main(void) {
char *text = "aababaababacb";
char *partten = "ababacb";
int m = strlen(partten);
int *next = (int *)malloc((m + 1) * sizeof(int));
kmp_getnext(partten, next);
kmp_search(text, partten, next);
return 0;
}
KMP算法
最新推荐文章于 2024-11-16 09:45:51 发布
本文深入讲解了KMP算法的工作原理及实现过程,包括如何构造部分匹配表(next数组)以及如何利用该表进行高效的字符串匹配搜索。通过具体示例代码演示了KMP算法的两个核心步骤:获取next数组和进行模式匹配。
10万+

被折叠的 条评论
为什么被折叠?



