kmp算法是一个字符串匹配的算法,利用前缀和后缀相同进行大幅度移动,从而把算法复杂度提高到O(m+n)
比如用abcab去匹配,当到了第二个b失配的时候,第二个b之前的字符串abca的长度为1的前缀和后缀相等,我们就可以把字符串向后移动3个,而不是1个
int *getNext(char s[]) {
int sLen = strlen(s), j = 0;
int* next = new int[sLen];
int k = next[0] = -1;
while (j < sLen - 1) {
if (k == -1 || s[k] == s[j]) {
++k;
++j;
next[j] = k;
}
else k = next[k];
}
//优化
/*while (j < sLen - 1) {
if (k == -1 || s[k] == s[j]) {
++k;
++j;
if (s[k] != s[j])next[j] = k;
else next[j] = next[k];
}
else k = next[k];
}*/
return next;
}
int kmp(char s[], char p[]) {
int i = 0, j = 0, sLen = strlen(s), pLen = strlen(p);
int *next = getNext(p);
while (i < sLen&&j < pLen) {
if (j == -1 || s[i] == p[j]) {
++i;
++j;
}
else j = next[j];
}
int temp;
if (j == pLen)temp = i - j;
else temp = -1;
delete[] next;
return temp;
}
有空再补充