KMP
Posted fjqfjq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP相关的知识,希望对你有一定的参考价值。
目录
KMP
得到NEXT数组
void getNEXT() {
int i = 0, j = NEXT[0] =-1;
while (i<Find.size()){
if (j == -1 || Find[i] == Find[j]) {
i++;j++;
NEXT[i] = j;
}
else {
j = NEXT[j];
}
}
}
在文本串中找到第一个匹配串的位置
int FirstKmp() {
int i = 0, j = 0;
while (i < a.size()) {
if (j == -1 || a[i] == Find[j]) {
i++, j++;
if (j == Find.size()) {
return i - j;
}
}
else j = NEXT[j];
}
return -1;
}//在a中找到第一个Find的位置
查找文本串中有多少匹配串
可以重叠的
int ManyKmp() {
int i = 0, j = 0,ans=0;
while (i < a.size()) {
if (j == -1 || a[i] == Find[j]) {
i++, j++;
if (j == Find.size()) {
ans++;
j = NEXT[j];
}
}
else j = NEXT[j];
}
return ans;
} //在a中找几个可以重叠的Find
不可以重叠的
int ManyKMP() {
int i = 0, j = 0, ans = 0;
while (i < a.size()) {
if (j == -1 || a[i] == Find[j]) {
i++, j++;
if (j == Find.size()) {
ans++;
j = 0;
}
}
else j = NEXT[j];
}
return ans;
}//在a中找几个不可以重叠的Find
其他小结
如果一个字符串满足 len%(len-next[len])==0,则这个字符串是一个周期串(存在最小循环节),循环次数为 len / ( len-next[len] )
如果 len%(len-next[len])!=0,这个字符串也存在循环节,但是最后一个循环节不完整
以上是关于KMP的主要内容,如果未能解决你的问题,请参考以下文章