回顾KMP算法,并对KMP中计算后缀前缀计数表的特定行感到困惑。关于KMP中预处理表格的疑惑
算法kmp_table: 输入: 字符,W(字进行分析来) 整数数组的数组,T(待填充的表) 输出: 没什么(但在操作期间,它填充表)
define variables:
an integer, pos ← 2 (the current position we are computing in T)
an integer, cnd ← 0 (the zero-based index in W of the next
character of the current candidate substring)
(the first few values are fixed but different from what the algorithm
might suggest)
let T[0] ← -1, T[1] ← 0
while pos is less than the length of W, do:
(first case: the substring continues)
if W[pos - 1] = W[cnd],
let cnd ← cnd + 1, T[pos] ← cnd, pos ← pos + 1
(second case: it doesn't, but we can fall back)
otherwise, if cnd > 0, let cnd ← T[cnd]
(third case: we have run out of candidates. Note cnd = 0)
otherwise, let T[pos] ← 0, pos ← pos + 1
上面是直接从维基百科。我有点困惑,如果cnd > 0
为什么设置cnd := T[cnd]
,不应该被重置回0,如果我们再次开始?