请解释为什么我们在下面的代码中用next [j-1]代替j的值: http://computing.dcu.ie/~humphrys/Notes/String/kmp.html 点击链接了解表格概念
i = 0
next[i] = 0
i++
j = 0
while ( i < m )
{
if ( pattern[j] == pattern[i] )
{
next[i] = j+1
i++
j++
}
else ( pattern[j] != pattern[i] )
{
if ( j > 0 )
j = next[j-1] //this part i am not able to figure out
//why don't we just decrement j-1?
else ( j == 0 )
{
next[i] = 0
i++
j = 0
}
}
}
答案 0 :(得分:0)
此处j
会跟踪到目前为止的匹配长度,i
会跟踪当前正在处理的字符串的位置。因此,如果j
长度的匹配在位置i
处失败,则函数会尝试找到小于j
长度匹配的最长长度。所以它将j
更改为next[j - 1]
,将i保持在同一位置。
注意next [x]包含到目前为止最长匹配的长度。如果在长度为j的第i个索引处匹配失败,则确保没有与此匹配的长度为j的文本的前缀。所以我们应该在j - 1
处查找匹配并继续尝试,直到找到与字符串前缀匹配的正长度或j变为0。