让我们考虑一个例子: text =" AABCAABDCAAB", pattern =" AABCAAB"
在此示例中,模式将匹配index = 0
的 AABCAAB DCAAB
的 AABCAAB
根据KMP算法,当j =模式长度时,我们发现匹配并重置j = lps [模式长度-1] = 3,这意味着模式[j] =' C'
算法跳了一下:
AABCAAB的 d CAAB
_____ AAB C AAB
不考虑跳跃之间的情况,例如:
AABCAABDCAAB
_AABCAAB
AABCAABDCAAB
__AABCAAB
...
在这种情况下可以忽略一些比赛吗?
答案 0 :(得分:2)
证明KMP算法在所有情况下都能正常工作。它背后的主要思想是,如果你匹配了模式的前k个字符,你就知道文本的k个字符,因为它们完全匹配那些k个字符。计算移位表,以便在匹配k个字符时使用的移位尽可能安全地使用,只要知道这些k个字符。
在您的示例中,您刚刚匹配AABCAAB,因此您知道文本是AABCAAB。您刚刚匹配的模式中只有一个C,因此您必须将模式移动到足以使得用于匹配的C在下一次尝试匹配时不与模式的任何部分重叠,这种情况为您提供下一次尝试的匹配位置。
(我注意到KMP算法通常被描述并证明不是模式的不规则变化,而是沿着要搜索的文本定期踩踏,并计算到目前为止已经匹配了多少个模式的字符。因为那里是使用该算法视图的证据,我们知道它适用于所有情况。)