const int MAXN = 1e5 + 5e2;
int Next[MAXN];
char str1[MAXN], str2[MAXN]; //这里以str1为母串,str2为子串
void getNext() {
Next[0] = -1;
int len = strlen(str2);
int j = 0;
int k = -1;
while (j < len) {
if (k == -1 || str2[j] == str2[k]) {
Next[j++] = k++;
} else {
k = Next[k];
}
}
}
int kmp() {
int len1 = strlen(str1);
int len2 = strlen(str2);
getNext();
int res = 0;
int j = 0;
for (int i = 0; i < len1; i++) {
while (j && str2[j] != str1[i]) {
j = Next[j];
}
if (str2[j] == str1[i]) {
j++;
}
if (j == len2) {
res++;
j = 0;//字符不能重复使用,初始化模式串位置
}
}
return res;
}
KMP算法模板
于 2021-11-17 19:41:19 首次发布