Knuth-Morris-Pratt 失败表

use*_*401 3 algorithm knuth-morris-pratt

我正在为我参加的考试而学习,我正在查看 Knuth-Morris-Pratt 算法。考试的内容是失败表和 DFA 构造。我了解 DFA 构造,但我不太了解如何制作失败表。

如果我有一个模式“abababc”的例子,我如何从中构建一个失败表?解决办法是:

失败表:

0 1 2 3 4 5 6 7

0 0 0 1 2 3 4 0

但我怎么得到呢?没有代码只是对如何获得它的解释是必要的。

izo*_*ica 5

i字符串的失败表中单元格的值s定义如下:取s以位置 结尾的子串,单元格中的值是该子串i的最长适当(不是整个字符串)后缀的长度,等于到其相同长度的前缀。

让我们以您的示例为例,考虑 的值6s长度为 6的子串是ababab。它有6个后缀:bababababbababb在另一方面其应有的前缀 ababaabababaaba。现在很容易看出,与相同长度的前缀相等的后缀是ababab。其中较长的是abab,因此单元格 6 中的值是其长度 - 4