#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;
}
参考资料:1.Knuth-Morris-Pratt algorithm
2.KMP算法详解