关于KMP的许多文章都提到KMP本身的失败功能有很多应用。
一个这样的应用程序是找到最小的字符串,当连接k次时给出原始字符串(句点)。
但我找不到任何其他的东西。还有哪些其他问题涉及KMP故障功能?
答案 0 :(得分:3)
KMP计算字符串所有前缀的边界,它们本身就是字符串算法的关键概念。 (计算整个单词本身的边界是不平凡的,而KMP(失败函数)是这样做的标准!)
s 的边框只是 s 的前缀和后缀的任何单词。
正如你正确地注意到的,计算边界能力的一个突出应用是计算最小字符串w的可能性,这样对于某些自然的k w ^ k = s 对于给定的字符串 s 。这被称为s的原始根。
原因是边框和字符串句点之间的二元性。字符串 s 的期间是 w 不超过 s 的任何字符串,以便 s 是字符串 wwww 的前缀...例如, abc 是一段 abcabcab 即可。事实证明,边界与单词的句点之间存在1:1的对应关系;在上面的示例中,请注意 abcab 是 abcabcab 的边框。通常,只要 w 是 s 的句点,那么从 s 中删除 w 之后的字符串它的开头( w ^ - 1 s )是 s 的边界。同样,如果 w 是 s 的边框,那么当您删除后缀 w s 中保留的单词 >是一段 s 。
句点是分析字符串属性的重要工具。它们用于例如在字符串中查找重复(运行)的算法中;有关概述,请参阅this paper.