KMP算法
内容
求一个字符串在另一个字符串中第一次出现的位置。步骤如下:
1.利用键盘输入两个字符串,一个设定为主串,另一个设定为子串;
2.利用KMP算法,求出子串在主串中第一次出现的位置。
代码实现
话不多说,上代码。
#include<stdio.h>
#include<string.h>
typedef struct SString
{
char ch[100];
int length;
}SString;
int Index_KMP(SString S,SString T,int next[]);
void get_next(SString T,int next[]);
int Index_KMP(SString S,SString T,int next[])
{
int i=0,j=1;
while(i<=S.length&&j<=T.length) //判断是否存在比括较到串尾的字符串
{
if(j==0||S.ch[i]==T.ch[j])
{
++i;
++j;
}
else
j=next[j]; //模式串向后移动
}
if(j>T.length)
return i-T.length; //匹配成功
else
return 0; //匹配失败
}
void get_next(SString T,int next[]) //求模式串T的next函数值并存入数组
{
int i=1,j=0;
next[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int j;
SString s,t;
int next[100],k;
printf("请输入主串:");
scanf("%s",s.ch+1);
s.length=strlen(s.ch+1);
printf("请输入模式串:");
scanf("%s",t.ch+1);
t.length=strlen(t.ch+1);
get_next(t,next);
printf("next[j]: ");
for(j=1;j<t.length+1;j++)
{
printf(" %d ",next[j]);
}
printf("\n");
k=Index_KMP(s,t,next);
printf("模式串在主串中匹配的位置: %d\n",k);
return 0;
}
实验结果
利用KMP算法求出模式串在主串中第一次出现的位置:
匹配成功,输出匹配位置:
匹配失败,输出0
总结
KMP算法相比BF算法较难理解,但运行效率得到提高。