在我自己的理解,我们用故障功能F[i]
来代表最长前缀的从零开始的索引是一样的子串S[0...i]
(为最长的,我指的是最长的后缀比整个子串本身)
从您的OP等,我认为基于1您的实现或教程使用但是这完全取决于执行
请看下面的例子:S = abababcabab
的失败功能会像F = [-1,-1,0,1,2,3,-1,0,1,2,3]
你可以看什么仔细是发生了什么事时,该算法是在完成的时间计算为S' = ababab????
和失败的功能F = [-1,-1,0,1,2,3,?,?,?,?,?]
现在,下一个字符是c
,则算法将测试它是否可以附加在已知最长的前缀(后缀)abab
上以制作更长的前缀。测试失败为前缀ababa
!=后缀ababc
,但那又如何?
然后该算法将尝试寻找失败的最长前缀(后缀)的最长前缀(后缀),看看怎么样等候一个c
会给我们的比赛(如果是的话,那就是答案)。
这意味着该算法将测试abab
这是ab
的最长前缀(后缀),我们可以知道,很快,因为我们知道F(abab) = 3
(我们测试追加一个c
和失败),我们知道F(F(abab)) = F(3) = 1
,这是ab
的位置。
同样的事情发生递归,直到你说我们找到一个匹配或根本没有匹配。当匹配失败时,F[]
的“跳跃”正在执行此过程:测试下一个潜在最长前缀(后缀),如果失败,则找到下一个前缀...
了解回溯失配不是一件简单的事情。试试这个例子和更多的例子,手动在纸上找出来。 – FazeL