KMP算法是一种改进的字符串匹配算法
KMP的核心在于NEXT数组。
初始化next数组很巧妙,用next自己匹配自己,使得复杂的从m*m下降到m
求next数组和kmp匹配的函数有相似之处
暴力搜索复杂度m*n,KMP为m+n,效率很不错,不过在一些特定情况下kmp表现也会很糟糕,此处不做讨论。
void init_next(char *t, int *next) {
int i = 0, j = -1;
next[i] = j;
int len = strlen(t);
while(i < len) {
if (j == -1 || t[i] == t[j]) {
next[++i] = ++j;
} else {
j = next[j];
}
}
}
int kmp(char *s, char *t, int *next) {
int lens = strlen(s), lent = strlen(t);
int i = 0, j = 0;
while(i < lens && j < lent) {
if(j == -1 || s[i] == t[j]) {
++i; ++j;
} else {
j = next[j];
}
}
if(j == lent) {
return i-lent;
} else {
return -1;
}
}