int next[...];//大小为pattern串的长度
//常规写法
void getNext(char s[],int len)
{
int j=-1;
next[0]=-1;
for(int i=1;i<len,i++)
{
while(j!=-1&&s[i]!=s[j+1])
{
j=next[j];
}
if(s[i]==s[j+1])
{
j++;
}
next[i]=j;
}
}
int KMP(char text[],char pattern[])
{
int n=strlen(text),m=strlen(pattern);
getNext(pattern,m);
int ans=0,j=-1;
for(int i=0;i<n;i++)
{
while(j!=-1&&text[i]!=pattern[j+1])
{
j=next[j];
}
if(text[i]==pattern[j+1])
{
j++;
}
if(j==m-1)
{
ans++;
j=next[j];
}
}
return ans;
}
//更快
void getNextval(char s[],int len)
{
int j=-1;
nextval[0]=-1;
for(int i=1;i<len,i++)
{
while(j!=-1&&s[i]!=s[j+1])
{
j=nextval[j];
}
if(s[i]==s[j+1])
{
j++;
}
if(j==-1||s[i+1]!=s[j+1]) //不同之处
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
}
int KMP(char text[],char pattern[]) //无改动
{
int n=strlen(text),m=strlen(pattern);
getNext(pattern,m);
int ans=0,j=-1;
for(int i=0;i<n;i++)
{
while(j!=-1&&text[i]!=pattern[j+1])
{
j=nextval[j];
}
if(text[i]==pattern[j+1])
{
j++;
}
if(j==m-1)
{
ans++;
j=nextval[j];
}
}
return ans;
}
KMP
最新推荐文章于 2019-03-22 21:00:45 发布