KMP算法即是模式字符串自身的匹配。移位数 = 已匹配长度 - 最长前后缀长度
移位应该使最长前缀与最长后缀相重合,若无最长前后缀,直接跳过已匹配区间。
最长后缀前面的区间中没有可能发生匹配通过吗?
如果匹配通过,则说明最长前后缀不正确,显然两者矛盾,因此疑问证伪。
=============================================(例一)
设一段字符串ABXYAB*****,当匹配到ABXYAB之后出错。
源字符串 *****ABXYAB*****
匹配字符串 ABXYAB*****
其中显见的条件是AB为最长前后缀,此时应直接移位,继续匹配。
源字符串 *****ABXYAB*****
匹配字符串 ABXYAB*****
以下1-3位的移位,若出现匹配通过,则都与AB为最长前后缀的显见条件相矛盾,因此证伪。
ABXYAB
ABXYAB 说明A=B=X=Y,最长前后缀为AAAAA
ABXYAB
ABXYAB 说明A=X,B&#