KMP表语句难度大

时间:2014-07-25 18:46:33

标签: algorithm pattern-matching substring dynamic-programming

请解释为什么我们在下面的代码中用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             
 }
 }
 }

1 个答案:

答案 0 :(得分:0)

此处j会跟踪到目前为止的匹配长度,i会跟踪当前正在处理的字符串的位置。因此,如果j长度的匹配在位置i处失败,则函数会尝试找到小于j长度匹配的最长长度。所以它将j更改为next[j - 1],将i保持在同一位置。

注意next [x]包含到目前为止最长匹配的长度。如果在长度为j的第i个索引处匹配失败,则确保没有与此匹配的长度为j的文本的前缀。所以我们应该在j - 1处查找匹配并继续尝试,直到找到与字符串前缀匹配的正长度或j变为0。