#include<stdio.h>
#include<string.h>
void getnext(int next[],char *str)
{
int i,j=0,k=-1,length;
length=strlen(str);
next[0]=-1;
while(j<length)
{
if(k==-1||str[j]==str[k])
{
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(int next[],char *str1,char *str2)
{
int i=0,j=0,length1,length2;
length1=strlen(str1);
length2=strlen(str2);
while(i<length1&&j<length2)
{
if(str1[i]==str2[j]||j==-1)
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>=length2)
return i-length2;
else
return -1;
}
int main(void)
{
char str1[50],str2[50];
int next[50],i,j;
scanf("%s",str1);
// getchar();
scanf("%s",str2);
getnext(next,str2);
printf("%d\n",kmp(next,str1,str2));
return 0;
}
acm算法之kmp算法
最新推荐文章于 2022-05-16 11:30:01 发布