getNext函数
void getNext(string pattern, int next[]) {
int k = -1, j = 0;
next[j] = k;
while(j < pattern.length()) {
if(k == -1 || pattern[j] == pattern[k]) {
next[++j] = ++k;
} else {
k = next[k];
}
}
}
kmp
int kmp(string target, string pat, int k, int next[]) {
int posP = 0, posT = k;
int lenP = pat.length();
int lenT = target.length();
while(posP < lenP && posT < lenT) {
if(posP == -1 || target[posT] == pat[posP]) {
posP++;
posT++;
} else {
posP = next[posP];
}
}
printf("%d %d\n", posP, lenP);
if(posP < lenP)
return -1;
else
return posT - lenP;
}
对于主串M