第一部分
从这里可以得出
if (T[k] == T[j])
{
k++;//k=next[j]
next[++j] = k;
}
这里使k++,后面的计算可以通过再次利用k的值和T[k]=T[j]进行计算
第二部分
如字模式串T=“abaababc”
j=7时,T[3]≠T[6],那就要找出T[0]到T[5]之间第二大子串
为什么不是第一大子串,如果找出T[0]到T[5]第一大子串,即T[0]T[1]T[2]=T[3]T[4]T[5],那这样又比较T[3]和T[6]之间地大小,死循环了。
而令k=next[k]的过程中,就能帮助找到第二大子串,为什么?其推断过程如下
∵T[0]...T[2]=T[3]...T[5] 即aba=aba
∴这里的next[k]=next[3]=1,T[2]...T[2]=T[5]...T[5],即a=a
又T[0]...T[0]=T[2]...T[2],即a=a
∴T[0]...T[0]=T[5]...T[5]
这就是上述代数式的具体意义
在得知T[0]等于T[5]的情况下,我们再判断T[1]是否等于T[6]
所以我们在第二步的推导中,就要将k=next[k]
这样才可以通过比较T[k]=T[j]来比较T[1]=T[6]
第三部分
如果在k=next[k]的这个不断回溯的过程中,k=next[0]=-1时,说明T[0]到T[j-1]不存在真前缀和真后缀相等的子串,next[j+1]=0。
if(k==-1)
{
next[++j]=0;
}
假设next[1]=0啊,那么下一步要通过T[k]=T[j]来计算next[2]的值,j已经变成2了,但是k是多少,所以我们就得记录下k的值,给后续的数字使用。那我们就可以比较T[0]和T[1]来计算next[2]
if(k==-1)
{
next[++j]=0;
k=0;
}
第四部分
一开始next[0]=-1,要计算next[1]时,k=next[0]=-1,所以初始化包括
next[0]=-1;k=-1
void getNext(char T[], int next[])
{
int j = 0, k = -1;
while (T[j] != '\0')
{
if (k == -1)
{
next[++j] = 0;
k = 0;
}
else if (T[j] = T[k])
{
k++;
next[++j] = k;
}
else
k = next[k];
}
}