讲解详见matrix67大神博客,直接上代码了。
#include <stdio.h>
#include <string.h>
int next[100];
int pre_processing(char* s)
{
next[0]=0;
int i,j;
for(i=1;i<strlen(s);i++)
{
j=next[i-1];
while(j!=0&&s[j]!=s[i])
j=next[j-1];
if(s[j]==s[i]) next[i]=j+1;
else next[i]=0;
}
return 0;
}
int kmp(char *a,char *b)
{
int i,j=0;
for(i=0;i<strlen(a);i++)
{
while(j>0&&a[i]!=b[j])
j=next[j-1];
if(a[i]==b[j])
{
j++;
}
if(j==strlen(b))
return i-j+1;
}
return -1;
}
int main()
{
char a[100],b[100];
scanf("%s",a);
scanf("%s",b);
pre_processing(b);
printf("%d",kmp(a,b));
return 0;
}