我确实理解了KMP算法,即存储用于匹配带有前缀的后缀的值的概念,然后在搜索字符串时不返回,因为模式“abcdabca”前缀数组将是{0,0,0, 0,1,2,3,1} 我理解到{0,0,0,0,1,2,3,_}然后第4个位置的'd'最后与'a'不匹配。然后algo说回到arr [j-1]如果j!= 0,我可以看到这给了我们正确的结果但是我不明白为什么我们要回到之前的元素[data]理解基础。
我们回去直到找到匹配元素或j == 0,我无法理解为什么要回去。
由于
答案 0 :(得分:1)
根据我自己的理解,我们使用失败函数F[i]
来表示最长前缀的基于0的索引,该索引与子串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
的内容将给我们一个匹配(如果是的话,那就是答案)。
这意味着该算法将测试<{strong> abab
的{strong>最长前缀(后缀)ab
,我们可以快速了解,因为我们知道F(abab) = 3
(我们测试附加c
并失败),我们知道F(F(abab)) = F(3) = 1
,这是ab
的位置。
同样的事情是递归地发生,直到你说我们找到匹配或根本没有匹配。匹配失败时F[]
的“跳跃”是实现此过程:测试下一个可能的最长前缀(后缀),如果失败,找到下一个...