完整代码如下:
#include <stdio.h>
#include <string.h>
void getNext(char s[],int next[]);
int KMP(char s1[],char s2[],int next[]);
int main() {
int i= 0;
int next[1000];
char s2[10],s1[30];
printf("请输入s1查找串:\n");
scanf("%s",s1);
printf("请输入s2模板串:\n");
scanf("%s",s2);
printf("获取next数组:\n");
getNext(s2,next);
for (int i = 0; i < strlen(s2); i++)
{
printf("下标:%d 最长公共串长度:%d\n",i,next[i]);
}
i=KMP(s1,s2,next);
printf("%d\n",i);
return 0;
}
void getNext(char s[],int next[])
{
int len=0;
int i=0;
int j=-1;
next[0]=-1 ;
len=strlen(s);
while(i<len-1)
{
printf("当前i的值:%d j的值:%d\n",i,j);
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int KMP(char s1[],char s2[],int next[])
{
int i=0;
int j=0;
int len1=strlen(s1);
int len2=strlen(s2);
while(i<len1&&j<len2)
{
printf("kmp i:%d j:%d\n",i,j);
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>=len2)
return i-len2+1;
else
return -1;
}
运行结果如下:
next数组:
index | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
value | -1 | 0 | 0 | 1 | 1 |
运行顺序:
1.首先找到next数组的每个字串的最长公共串的长度。获取next数组的运行顺序
2.调用kmp函数进入while循环