KMP是一种匹配算法,其优化了匹配过程,效率可以达到O(n+m)
KMP有两个过程,第一个是求主串next数组,相当于自己匹配自己,求出最长公共前后缀
第二个是把模式串放在主串上匹配
求next数组
memset(nxt,0,sizeof(nxt));
for(int i=1;i<b.length();i++)
{
int j=nxt[i];
while(j&&b[j]!=b[i])
j=nxt[j];
if(b[i]==b[j])
{
nxt[i+1]=j+1;
}
else
nxt[i+1]=0;
}
匹配
int j=0;
bool k=0;
for(int i=0;i<a.length();i++)
{
while(j&&b[j]!=a[i])
{
j=nxt[j];
}
if(b[j]==a[i])j++;
if(j==b.length())
{
if(!k)
{
k=1;
cout<<i-b.length()+2;
}
else cout<<" "<<i-b.length()+2;
j=nxt[j];
}
}
return k;