#本文论述个人版本的kmp算法,欢迎借鉴和改正
个人感觉kmp算法最难理解的部分就是案例了
一个优秀的数据可以方便读者更好地理解代码
以下是本人构造的一个案例,记录在这里,也方便大家更好的阅读
来一个练习题检测一下
acwing
以下是本人代码,可以供参考:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int N=1e6+10;
int n,m,ne[N];
string pat,str;
void data_in()
{
scanf("%d",&n);
getchar();
getline(cin,pat);
scanf("%d",&m);
getchar();
getline(cin,str);
}
void init()
{
memset(ne,0,sizeof(ne));
ne[0]=0;
for(int i=1;i<n;i++)
{
int k=ne[i-1];
while(k && pat[i]!=pat[k])
k=ne[k-1];
if(pat[i]==pat[k]) ne[i]=k+1;
}
}
void data_out()
{
int i=0,j=0;
for(;i<m;i++)
{
while(j && str[i]!=pat[j])
j=ne[j-1];
if(str[i]==pat[j])
j++;
if(j>=n){
printf("%d ",i-j+1);
j=ne[j-1];
}
}
}
int main()
{
data_in();
init();
data_out();
return 0;
}