#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct
{
char data[50];
int length;
}sqlist;
void initsqlist(sqlist &s)
{
printf("请输入字符串:\n");
scanf("%s",s.data);
s.length=strlen(s.data);
printf("字符串长度为%d\n",s.length);
}
//求next数组
void get_next(sqlist st,int next[])
{
int i=0,j=-1;
next[0]=-1;
while (i<st.length)
{
if(j==-1||st.data[i]==st.data[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
//输出next数组
void put_next(int next[],int n)
{
int i;
printf("next数组内容为:(以1~n为例)\n");
for(i=0;i<n;i++)
{
printf("%d ",next[i]+1);
}
}
//KMP算法
int index_kmp(sqlist s,sqlist st,int next[])
{
int i=0,j=0;
while (i<s.length&&j<st.length)
{
if(j==0||s.data[i]==st.data[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j+1>st.length)
return i-st.length+1;
else
return 0;
}
int main()
{
sqlist s,s2;
int *next;
initsqlist(s);
initsqlist(s2);
next=(int *)malloc(sizeof(int)*(s2.length));
get_next(s2,next);
put_next(next,s2.length);
printf("\n主串:%s\n模式串:%s\n模式串出现在主串的位置为:第%d位",s.data,s2.data,index_kmp(s,s2,next));
return 0;
}
KMP算法代码实现
最新推荐文章于 2024-07-11 15:06:18 发布