前言
自从我学了串之后,知道了BF(爆破型算法)发现时间复杂度不是很理想,在研究过KMP算法之后,才知道原来先辈的思想这么好,并且我也希望已经出现的算法,自己研究透彻。
【天勤公开课】KMP算法简单易懂版
这个链接可以帮助大家更好的理解关于这部分的KMP内容,由于自己不会做动画,所以就先请大家移步了
代码部分
void get_next(String T, int *next)
{
int i,k;
i=1;
k=0;
next[1]=0;
while (i<T[0]) /* 此处T[0]表示串T的长度 */
{
if(k==0 || T[i]== T[k])
{
++i;
++k;
next[i] = k;
}
else
k= next[k]; /* 若字符不相同,则k值回溯 */
}
}
代码分布解释
首先我们有这样一个字符串
0 1 2 3 4 5 6 a b c a b x 其中根据代码中,我们可以知道i=1 k=0 next[1]=0
进入循环
第一步
因为 k=0
则进入 if 判断 满足 k==0
此时 ++i ++k i=2 k=1
0 1 2 3 4 5 6 i a b c a b x next[2]=1
第二步
因为 k=1
进入 if 判断 T[i] ≠ T[k]
则 k 进入 else
此时 k = next[k] = next[1] = 0
第三步
因为 k=0
则进入 if 判断 满足 k==0
此时 ++i ++k i=3 k=1
0 1 2 3 4 5 6 i a b c a b x next[3]=1
第四步
因为 k=1
进入 if 判断 T[i] ≠ T[k]
则 k 进入 else
此时 k = next[k] = next[1] = 0
第五步
因为 k=0
则进入 if 判断 满足 k==0
此时 ++i ++k i=4 k=1
0 1 2 3 4 5 6 i a b c a b x next[4]=1
第六步
因为 k=1
则进入 if 判断 满足 T[i]==T[k]
此时 ++i ++k i=5 k=2
0 1 2 3 4 5 6 i a b c a b x next[5]=2
第七步
因为 k=2
则进入 if 判断 满足 T[i]==T[k]
此时 ++i ++k i=6 k=3
0 1 2 3 4 5 6 i a b c a b x next[6]=3
退出循环
因为 i=6
不满足 while (i<T[0]) //T[0]表串长度
则退出循环