#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get_next(char *t,int *next)
{
int i=0,j=-1,n;
next[0]=-1;
while(t[i]!='\0')
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
if(t[i]!=t[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
for(n=0;n<i;n++)
{
printf("%d\t",next[n]);
}
}
int KMP(char *s,char *t,int next[])
{
int i=0,j=0;
if(s==NULL||t==NULL)
return -1;
while(s[i]!='\0'&&t[j]!='\0')
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
if(j==strlen(t))
return (i-strlen(t));
}
return -1;
}
int main()
{
char s[100],t[100];
int next[100];
int ret;
printf("请输入主串:\n");
gets(s);
printf("请输入模式串:\n");
gets(t);
printf("s的长度:%d",strlen(s));
printf("t的长度:%d",strlen(t));
printf("模式串的next值:\n");
get_next(t,next);
ret=KMP(s,t,next);
if(ret==-1)
printf("匹配失败\n");
else
printf("匹配成功,串t在串s第一次出现的位置是%d\n",ret);
return 0;
}
KMP算法,C语言实现
最新推荐文章于 2022-04-28 19:52:55 发布