我是通过网上的教程学的KMP算法,网上的教程确实非常详细,但是关于next数组实现中的
else
j=next[j];
这一句大部分网上的教程都是没有过多解释,或者根本就没有解释为什么。对于我这个刚学这个算法的人来说,根本想不通为什么。今天终于理解了,所以总结一下。
void get_next(string s,int next[])
{
int length=s.length();
int i=0,j=-1;
next[0]=-1;
while(i<length)
{
if(j==-1||s[i]==s[j]) /*s[i]表示后缀的单个字符*/
/*s[j]表示前缀的单个字符*/
{
++i;
++j;
next[i]=j;
}
else
j=next[j]; /*若j值不相同,则j值回溯*/
}
}
这一句的解释为
失配时,模式串向右移动的位数为:已匹配字符数 - 失配字符的上一位字符所对应的最大长度值
关于这个知识点,有一个博客讲的特别好: http://wiki.jikexueyuan.com/project/kmp-algorithm/define.html
想深入理解的可以去看看。