KMP

KMP

f数组即为next数组,表示回退位置和以当前为结尾匹配长度

# include <bits/stdc++.h>
using namespace std;

//字符串从0开始存储 next数组从1开始算起
const int MAXN=1e3+100;
int f[MAXN];
char ch[MAXN];
void getFail(char *P,int *f)  //求自身匹配
{
int m=strlen(P);
f[0]=0,f[1]=0;
for(int i=1;i<m;i++){
int j=f[i];
while(j&&P[i]!=P[j]) j=f[j];
f[i+1]=P[i]==P[j]?j+1:0;
}
return ;
}
void Find(char *T,char *P,int *f)  //求两个字符串匹配
{
//在T中找P所在的位置
int n=strlen(T),m=strlen(P);
getFail(P,f);
int j=0;
for(int i=0;i<n;i++){
while(j&&P[j]!=T[i]) j=f[j];
if(P[j]==T[i]) j++;
if(j==m) printf("%d\n",i-m+1);  //P在T中出现的位置
}
return ;
}
int main()
{
cin>>ch;
getFail(ch,f);
printf("%d",f[strlen(ch)-1]);

return 0;
}



posted @ 2022-02-27 13:50  fengzlj  阅读(60)  评论(0)    收藏  举报