序言
对于KMP算法还有一些疑问的可以跳转到我的这篇文章——看文档、看教材都没搞懂KMP算法?六小时呕心力作,点进来就是血赚!,相信在这篇文章中你会有许多收获!(当然从KPM算法分析跳转过来的同学可以忽视这句话哈)
题目
答案
#include<stdio.h>
#include<string.h>
void GetNext(char T[],int next[]);
int KMP(char S[],char T[]);
int main()
{
int n,i;
scanf("%d",&n);
char S[n][80],T[n][80];
for(i=0;i<n;i++)
{
scanf("%s %s",S[i],T[i]);
}
for(i=0;i<n;i++)
{
if(KMP(S[i],T[i])==0) printf("not find!\n") ;
else printf("%d\n",KMP(S[i],T[i]));
}
}
void GetNext(char T[],int next[])
{
int i,j,len;
next[0]=-1;
for(j=1;T[j]!='\0';j++)
{
for(len=j-1;len>=1;len--)
{
for(i=0;i<len;i++)
if(T[i]!=T[j-len+i]) break;
if(i==len)
{
next[j]=len;
break;
}
}
if(len<1) next[j]=0;
}
}
int KMP(char S[],char T[])
{
int i=0,j=0;
int next[80];
GetNext(T,next);
while(S[i]!='\0'&&T[j]!='\0')
{
if(S[i]==T[j])
{
i++;j++;
}
else
{
j=next[j];
if(j==-1)
{
i++;j++;
}
}
}
if(T[j]=='\0') return(i-strlen(T));
else return 0;
}
注意
- len>=1而非len>=0
for(len=j-1;len>=1;len--)
- 不要错写为(S[i]!=’\0’&&T[i]!=’\0’)(T的循环遍历是 j 不是 i )
(S[i]!='\0'&&T[j]!='\0')
- 返回值根据题目要求看是否加1