KMP算法:
构造ne数组 和 匹配过程
vector<int> build_next(string s) {
vector<int> ne(s.size());
ne[0] = -1;
for (int i = 1, j = -1; i < s.size(); i++) {
while (j != -1 && s[i] != s[j + 1])j = ne[j];
if (s[i] == s[j + 1])j++;
ne[i] = j;
}
return ne;
}
int kmp(string p, string s) {
int res = 0;
vector<int> ne = build_next(s);
for (int i = 0, j = -1; i < p.size(); i++) {
while (j != -1 && p[i] != s[j + 1])j = ne[j];
if (s[j + 1] == p[i])j++;
if (j + 1 == s.size()) {
res++;
j = ne[j];
}
}
return res;
}
可以解决的其他问题:
最长公共前后缀 就是ne[n-1]+1
第二长公共前后缀
int test2() {
return ne[ne[a.size() - 1] + 1];
}
最长重复前缀ne数组里面的最大值 +1
最长回文前缀 s+ '#'+s.reverse(串和翻转之后的串拼接(中间有个‘%’特殊符号做分割))
然后以新的字符串构造next数组, next的最后一个值+1就是我们要的答案(最长的长度
循环节:
如果next[n]>0且n%L==0,则S可由循环节完全循环构成:
循环节长度为:L=n-next[n]-1,
循环周期为: n/L
以a b c a b c a b c为例
ne= -1 -1 -1 0 1 2 3 4 5
循环节长度:3 3个循环节构成
题目:
模式串为abcabcaaa,使用KMP算法进行模式匹配过程中,若模式串在位置j=7处与目
标串匹配失败,则下一次匹配时,应该是模式串的______位置与目标串失配位置进行匹
配。本题下标从0开始。【吉林大学计软两院2021级期末考试题】