/*
* KMP 算法
* 要点如下:
* 1 如何构建next表
* 2 如何利用next表进行模式匹配
* 指针位置的控制问题
* 数据结构上给的算法更精炼
*/
void get_next(char *T, int next[]) {
int len = strlen(T);
int i = 0;
int j = -1;
next[0] = -1;
while (i < len-1) {
if (j==-1 || T[i] == T[j]) {
++i, ++j;
if (T[i] != T[j]) next[i] = j;
else next[i] = next[j];
}
else j = next[j];
}
}
int Index_KMP(char *S, char *T, int pos) {
int len1 = strlen(S);
int len2 = strlen(T);
int *next = new int[len2];
get_next(T, next);
int i = pos-2;
int j = -1;
while (i < len1 && j < len2) {
if (j==-1 || S[i]==T[j]) {++i; ++j;}
else j = next[j];
}
delete [] next;
if (j >= len2) return i - len2;
else return 0;
}
int main() {
char *str1 = "ababaaababababcaaaa";
char str[] = "ababababca";
int pch = Index_KMP(str1, str, 1);
printf("%d\n", pch+1);
return 0;
}