原理如下:
代码如下:
注:因为王道书上的KMP是从下标1开始计算机的,这里为了不与王道书冲突,也从下标1开始计算机,即忽略下标0,所以字符串的下标0的字符定义为空格,并且算长度时也从下标为1的字符算起。
#include<stdio.h>
void get_next(char T[],int next[]){
int i=1,j=0;
next[1]=0;
while(i<strlen(T+1)){
if(j==0 || T[i]==T[j]){ //j==0表示第一趟直接赋next[1]的值为1
++i;++j;
next[i]=j; //若第i个字符等于第j个字符,则next[j+1]=next[j]+1
}
else
j=next[j]; //否则令j=next[j],循环继续
}
}
int KMP(char S[],char T[],int next[]){
int i=1,j=1;
while(i<=strlen(S+1) && j<=strlen(T+1)){
if(j==0 || S[i]==T[j]){
++i; ++j; //继续比较后继字符
}
else
j=next[j]; //模式串向右移动
}
if(j>strlen(T+1))
return i-strlen(T+1); //匹配成功
else
return 0;
}
int main()
{
char S[]=" ababcabcacbab";
char T[]=" abcac";
int next[20];
get_next(T,next);
printf("主串为:ababcabcacbab\n");
printf("子串为:abcac\n");
printf("开始匹配的位数是:%d",KMP(S,T,next));
return 0;
}