先存上一个比较牛的解释
https://blog.csdn.net/v_JULY_v/article/details/7041827
typedef struct
{
char* ch;
int length;
}Str;
结构体
对next数组的求解(天勤默认串的下标从1开始,目前不知道这样做有什么好处?)
void getnext(Str substr,int next[])
{
int i=1,j=0;
next[1]=0;
while(i<substr.length)
{
if(j==0||substr.ch[i]==substr.ch[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
kmp算法
int KMP(Str str,Str substr,int next[])
{
int i=1,j=1;
while(i<=str.length&&j<=substr.length)
{
if(j==0||str.ch[i]==substr.ch[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j>substr.length)
return i-substr.length;
else
return 0;
}
改进的求next的数组的方法。
void getnextval(Str substr,int nextval[])
{
int i=1,j=0;
nextval[1]=0;
while(i<substr.length)
{
if(j==0||substr.ch[i]==substr.ch[j])
{
++i;
++j;
if(substr.ch[i]!=substr.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
最后附上自己为了验证结果,编了一串冗长的main函数。
int main()
{
int next[maxSize];
int nextval[maxSize];
Str str;
Str substr;
str.length=13;
substr.length=5;
str.ch=(char *)malloc(sizeof(char)*15);
substr.ch=(char *)malloc(sizeof(char)*7);
strcpy(str.ch,"1ababcabcacbab");
strcpy(substr.ch,"1abcac");//
getnext(substr,next);
// getnextval(substr,nextval);
// for(int i=1;i<substr.length;i++)
// printf("%d",next[i]);
int m=KMP(str,substr,next);
printf("%d",m);
}
总结:日后这代码还得看下,现在只懂了个百分之七八十。