#include<stdio.h>
void get_nextval(char Model_string[],int nextval[]) //求优化的next[]数组
{
int i=1;
int j=0;
nextval[1]=0;
while(i<strlen(Model_string)-1)
{
if(j==0||Model_string[i]==Model_string[j])
{
i++;j++;
if(Model_string[i]!=Model_string[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
void get_next(char Model_string[],int next[])
{
int i=1;
int j=0;
next[1]=0;
while(i<strlen(Model_string)-1)
{
if(j==0||Model_string[i]==Model_string[j])
{
i++;j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int Index_KMP(char Main_string[],char Model_string[],int next[])
{
int i=1,j=1;
while(i<strlen(Main_string)&&j<strlen(Model_string))
{
if(j==0||Main_string[i]==Model_string[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j==strlen(Model_string))
return i-strlen(Model_string)+1;
else
return 0;
}
int main()
{
int n,i=1;
printf("请输入模式串的长度:");
scanf("%d",&n); //设置模式串的长度
char Main_string[1000],Model_string[n+2],read_input;
Main_string[0]='s',Model_string[0]='s'; //虽然下面从1开始赋值,但是0处必须也要有,不然要乱码,不能全部直接赋值成'\0',读入一个后就不会读了。
int next[n+1];
read_input=getchar(); //读回车
printf("请输入主串:");
while(1)
{
read_input=getchar();
if(read_input=='\n')
break;
else
{
Main_string[i]=read_input; //从i=1开始赋值,0这个下标没用,主要是为了迎合KMP算法思想,从位置1开始
i++;
}
}
printf("请输入模式串:");
for(int j=1;j<n+1;j++)
{
read_input=getchar();
Model_string[j]=read_input;
}
Model_string[n+1]='\0';
get_next(Model_string,next);
printf("next[]数组里面的值是:");
for(i=1;i<n+1;i++)
{
printf("%d",next[i]);
}
int index=Index_KMP(Main_string,Model_string,next);
printf("\n");
printf("在%d处匹配成功",index);
}
测试如图: