KMP求取子串位置KMP算法-CSDN博客
思路:
查找当前串头与尾部,相同且连续的字符个数,举例
abbfeab 当前最长前后缀为1(从0开始计数)
abbfeabb 当前最长前后缀为2
abbfeabbc 当前最长前后缀为-1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char c[]="ababaaababaa";
char *next=NULL;
char i=0,j=0; //i:前缀位置;j:后缀位置
int len=strlen(c);
next = (char *)malloc(strlen(c));
len--;next[0]=-1;//默认next为-1
while(j<len) //遍历c,求得next
{
if(j==0||c[i]!=c[j])
{
if(i) i=0; //若i不在前缀位置则返回
else next[++j]=0;
}else{
next[++j]=++i; //记录i当前位置,即当前最长前后缀的长度
}
}
printf("j:%d len:%d\r\n", j, len);
i=0;
while(i<len){ //打印结果
printf("%d ", next[i++]);
}
free(next);
return 0;
}
得出一下结果
-1 -1 0 1 2 -1 0
分析步骤:
a b a b a c a
0: i=0 j=0 c[i]=a c[j]=a next=-1 //a
1: i=0 j=1 c[i]=a c[j]=b next=-1 //ab
2: i=0 j=2 c[i]=a c[j]=a next=0 //aba
3: i=1 j=3 c[i]=b c[j]=b next=1 //abab
4: i=2 j=4 c[i]=a c[j]=a next=2 //ababa
5: i=3 j=5 c[i]=b c[j]=c next=无 //ababac
6: i=0 j=5 c[i]=a c[j]=c next=-1 //ababac
7: i=0 j=6 c[i]=a c[j]=b next=0 //ababaca