我已经尽力阅读了大部分关于此的文献,但仍然没有理解KMP算法中使用的失效函数是如何构建的。我一直指的是大多数人认为优秀的http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=stringSearching教程。但是,我还是不明白。如果你能给我一个简单易懂的解释,我会感激不尽。
答案 0 :(得分:9)
失败函数实际告诉我们:如果匹配字符串的X个字符,这个字符串的最长后缀是什么,这样它也是搜索字符串的前缀。
你在问它是如何构建的,这种方法很简单。
如果在字符串的末尾添加一个新字符,那就是构建f [x],如果它与位置f [x-1]处的字符匹配,那么f [x]就是f [ X-1] +1。
在其他不匹配的情况下,您会尝试查找越来越小的后缀并检查它们是否匹配。
例如,您有一个单词"accadaccac"
,您正在构建一个失败函数,而您刚刚添加了字母'c'
。假设你正在为最后一个字母'c'
建立一个失败函数。
"acca"
与前缀"acca"
匹配,现在添加字母'c'
,它与前缀'd'
后面的字母"acca"
不匹配。"acca"
的后缀,该后缀也是"accadaccac"
的前缀,但小于“acca”。这个问题的答案是f [length(“acca”) - 1],或f [3],即f [3] = 1,因为长度为1的后缀(只是字母'a'
)也是搜索字符串的前缀。'c'
与位置1上的角色匹配,瞧,匹配,所以现在你知道f [9] = f [f [8] -1] +1 = 2。我希望这会对你有所帮助。祝好运! :)
答案 1 :(得分:-2)
http://www.oneous.com/Tutorial-Content.php?id=24
您可以使用本网站的学习资源来了解KMP算法和失败功能。还尝试获取代码并在其上进行一些手动操作示例字符串。但是,了解其工作原理的最佳方法是在基本算法的某些变体上自行编码。我建议你从SPAYJ上的NHAY和PERIOD开始。