这是我在ItoA中看到的伪代码:
1 m = P.length
2 let pi[1...m] be a new array
3 pi[1] = 0
4 k=0
5 for q=2 to m
6 while k > 0 and P[k+1] != P[q]
7 k = pi[k]
8 if P[k+1] == P[q]
9 k = k+1
10 pi[q] = k
11 return pi
我怀疑为什么在第6行我们k = pi[k]
而不是k--
在我看来应该是检查长度为k
的前缀的方式(因为如果{{1}它意味着长度P[k+1] != P[q]
的前缀(也是后缀无法实现)也可以是后缀,即与k+1
比较,我也认为如果我们这样做,运行时间将会保持不变。
答案 0 :(得分:0)
递归调用k = pi[k]
搜索p[1..q]
的较小边框;因为pi[k]
是P[0..k]
的最大边界,p[1..q]
的边界小于pi[q]
。它将搜索,直到找到p[1..q]
的边框,其中下一个字符p[k+1]
不等于P[q+1]
。
您可以在此处找到更多详细信息:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm