KMP主要是利用匹配失败的串的相同前缀。
string t;
string s;
int nxt[maxn];//nxt数组求匹配串的前缀的那个值
void prekmp(string x) {//处理匹配串
memset(nxt, 0, sizeof(nxt));
int i, j;//前后指针
j = nxt[0] = -1;//头指针
i = 0;//后指针
int m = x.length();
while (i < m) {//处理完全部的
while (-1 != j && x[i] != x[j])j = nxt[j];//如果不等 往前回溯 直到相等或者头指针到头
nxt[++i] = ++j;//更新下标
}
}
int kmp(string x, string y) {//x是模式串 y是主串
int i, j;
int ans = 0;
prekmp(x);//预处理
int m = x.length();
int n = y.length();
i = j = 0;//一个指向匹配串 一个指向模式串
while (i < n) {
while (-1 != j && y[i] != x[j]) j = nxt[j];//更新匹配位置
i++; j++;//向后推移一位
if (j >= m) {//这部分可灵活变化
ans = 1;
break;
}
}
return ans;
}







Comments | NOTHING