关于KMP故障功能的解释

时间:2015-03-14 11:29:09

标签: algorithm knuth-morris-pratt

我正在阅读topcoder tutorial on KMP algorithm并且我无法理解文本的以下部分:

  

给定一个字符串(一个很长的字符串),找到所有正确的后缀   也是它的前缀。我们所要做的就是计算   "失败功能"给定字符串并使用信息   存储在其中以打印答案。

我知道如何计算失败函数,对于字符串abacababa,我得到以下数组[0, 0, 1, 0, 1, 2, 3, 2, 3]。问题是我无法弄清楚它如何帮助我找到

  

所有正确的后缀,也是它的前缀

根据我的理解,

假设为aaba

1 个答案:

答案 0 :(得分:0)

最长的正确后缀也是前缀是长度为p[n - 1]的前缀。下一个是此后缀的最长后缀,也是前缀。它正是长度p[p[n - 1] - 1]的前缀。我们不断重复它,直到我们得到一个空的前缀。

例如,对于那个abacaba字符串,它就是这样的:

  1. 最长的正确后缀也是前缀aba(因为p[n - 1]3)。

  2. 最长的正确后缀也是aba的前缀a(因为p[2]1)。

  3. ap[0] = 0)没有这样的后缀,所以我们完成了。

  4. 代码如下所示:

    cur = p[n - 1]
    while cur != 0:
         print(s[0 ... cur - 1])
         cur = p[cur - 1]