KMP算法的核心就是针对于匹配字符串的Next数组的计算
GenKMPNext函数初始化Next数组
使用了优化方法 即当p[next[i]]=s[j]=s[i]时,next[i]=next[next[i]]
就是说如果上次匹配失败的字符和下一次匹配失败的字符相同的话
那么这次匹配也是不必要的 所以就可以直接从下一次的字符的下一个字符开始匹配
#include<bits/stdc++.h>
using namespace std;
int len(char *s)
{
int i=0;
while(s[i++]!='\0'){}
return i-1;
}
void GenKMPNext(int next[],char *s)
{
int n=len(s);
next[0]=-1;
next[1]=0;
int i;
for(i=2;i<n;i++)
{
int k=0;
int max=0;
while(++k<i)
{
bool flag=true;
for(int j=0;j<k;j++)
{
if(s[j]==s[i-k+j])continue;
else
{
flag=false;
break;
}
}
if(flag)
{
max=k;
}
}
next[i]=max;
}
for(int i=2;i<n;i++)
{
if (s[next[i]]==s[i])next[i]=next[next[i]];
}
}
int Find(char* s,char * p)
{
int n=len(p);
int next[n];
GenKMPNext(next,p);
int i,j;
for(i=0, j=0;i<n && j<len(s);)
{
if(p[i]==s[j]){
i++,j++;
}
else if(next[i]>=0)i=next[i];
else {
i=0;j++;
}
}
if(i>=n)
{
return j-n;
}
else return -1;
}
int main()
{
char s[100];
cin>>s;
char p[10];
cin>>p;
cout<<Find(s,p)<<endl;
// int next[100];
// GenKMPNext(next,s);
// for(int i=0;i<len(s);i++)
// {
// cout<<next[i]<<endl;
// }
}