KMP算法next数组中k = next[k]
程序员文章站
2024-02-16 09:26:34
...
KMP算法next数组中k = next[k]
next数组是KMP算法的关键,用于储存模式串指针j回溯的值,当模式串与主串失配时,利用next数组更快地找到模式串下一次开始比较的位置。
下面是next数组的代码:
void Getnext(int next[],String t)
{
int j=0,k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k == -1 || t[j] == t[k])
{
j++;k++;
next[j] = k;
}
else k = next[k];
}
}
next数组主要是通过比较模式串最长公共前后缀来确定模式串指针移动的位置,这里我就不再赘述了,许多博主这个地方都讲的十分清楚。
我觉得上面这段代码最难理解的地方就是 k = next[k] ,这也是我一开始始终不能理解的地方,为什么要将k的值这样回溯?
当在模式串中发生失配时,我们不妨将前后缀分别看作主串和模式串,其实这里 k = next[k] 有点递归的意思,因为我们的Getnext函数是为了得到next数组,而在模式串的前后缀比较中(看作主串和模式串)发生失配的话,同样可以利用next数组来回溯k的值,因为前面{A B}已经配对过相等了,这里C和D不相等,也就是说当j指针指到最后的A时,它前面没有匹配的公共前后缀,即公共前后缀长度为0