- KMP这个东西一直是看了忘忘了看。今天又看了一遍,记一下,以后忘了的话能想得快一点。
KMP和朴素的字符串匹配不同点在于:传统的字符串匹配主串和模式串在匹配失败的时候都需要回退(主串退到开始匹配位的后一位,模式串退到自己的开头),时间复杂度O(m*n);而KMP的主串是始终不会退的,它利用了当前匹配失败字符之前的子字符串信息,用了一个next数组保存这个信息。
这里利用的信息是已匹配字符子串的最长的相同的前缀和后缀。e.g.
主串: abbaabbaaba
模式串: abbaaba
模式串匹配到最后一位的时候匹配失败,这时候就要看之前匹配过得abbaab最长的相同的前缀和后缀。abbaab前缀有a, ab, abb, abba, abbaa(不包含最后一个字符);后缀有b, ab, aab, baab, bbaab(不包含第一个字符)。最长匹配是ab,那模式串就回退到第3个字符继续匹配。那么为什么可以这样做呢?这个做法其实相当于模式串用自己的头部去匹配自己的尾部,因为当不匹配发生时,前面匹配的一小段对于两者是相同的,假设我们不用next数组回退,是不是也要一步一步那模式串去跟之前比过得那些字符比较呢?所以这里next数组的操作是合理合法的。