我正在阅读topcoder tutorial on KMP algorithm并且我无法理解文本的以下部分:
给定一个字符串(一个很长的字符串),找到所有正确的后缀 也是它的前缀。我们所要做的就是计算 "失败功能"给定字符串并使用信息 存储在其中以打印答案。
我知道如何计算失败函数,对于字符串abacababa
,我得到以下数组[0, 0, 1, 0, 1, 2, 3, 2, 3]
。问题是我无法弄清楚它如何帮助我找到
根据我的理解,所有正确的后缀,也是它的前缀
假设为a
和aba
。
答案 0 :(得分:0)
最长的正确后缀也是前缀是长度为p[n - 1]
的前缀。下一个是此后缀的最长后缀,也是前缀。它正是长度p[p[n - 1] - 1]
的前缀。我们不断重复它,直到我们得到一个空的前缀。
例如,对于那个abacaba
字符串,它就是这样的:
最长的正确后缀也是前缀aba
(因为p[n - 1]
是3
)。
最长的正确后缀也是aba
的前缀a
(因为p[2]
是1
)。
a
(p[0] = 0
)没有这样的后缀,所以我们完成了。
代码如下所示:
cur = p[n - 1]
while cur != 0:
print(s[0 ... cur - 1])
cur = p[cur - 1]