kmp算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 。
代码具体内容
假设s[m]为主串,下标从1开始,p[n]为子串
求next过程代码如下
for(int i=2,j=0;i<=n;i++)//i从2是因为默认next[1]=0
{
while(j&&p[i]!=p[j+1]
j=next[j];
if(p[i]==p[j+1])
j++;
next[i]=j;
}
kmp匹配过程如下
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[i]!=p[j+1]) j=next[j];
if(s[i]==p[j+1]) j++;
if(j==n)
{
cout<<i-n;
j=next[j];
}
}
此外,next数组具有以下周期性质
详见此题
https://www.acwing.com/solution/content/4614/