最近做练习题,做到KMP算法了,来搞一搞吧。。。
KMP算法之前那些BF算法,首位比较法都不想多说了,
直接来说KMP最难做的Next数组吧。
先来一个字符串,ababa
本篇文章用的next【0】是-1的
序号 0 1 2 3 4 5
字符串 a b a b a
next -1 0
接下来说怎么求吧,
next[0]=-1,next[1]=0
这个不用多说了吧?
开始比较,
求next[2] 就是比较 序号为1的字符串和对应next[1] 的字符串
也就是说比较b和a,两者不相等,
所以next[2]=next[0]+1=0,
总结来说就是求i的next值是求 str[i-1]和str[next[i-1]],
如果相同,则next[i]=next[i-1]+1,
否则接着往下找,就是next[next[i-1]],
找到最后,就是等于0的时候,将next[0]的值赋给next[i],
这样将上面字符串填充完整就是:
序号 0 1 2 3 4 5
字符串 a b a b a
next -1 0 0 1 2 3
理解的关键就是,next永远是前一个来决定后一个的值。
恩,就是这样,整理整理代码就是:
void Get_next()
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<len)
{
if(j==-1 || c[i]==c[j])
{
next[++i]=++j;
}
else j=next[j];
}
}