KMP算法
KMP算法
匹配算法
KMP算法的目标是,避免重复匹配从而减小时间复杂度。如:
字符串:
aabaabaafbaa模式串:
aabaaf
按照暴力模拟的思路。遍历到第六个字符b时,与模式串的第六个字符f不匹配,则需要从第二个字符a重新开始匹配。
而KMP算法可以找出之前已经匹配过的子串aa 从而字符串可以继续往后遍历不用回退,只用回退模式串的到第三个字符b。
前缀表
KMP匹配的方法是基于一个叫做前缀表的数组(有时候也被称为prev数组或next数组)。通过前缀表,可以快速得到模式串当前字符退回的位置。
例如aabaaf的前缀表为:[0, 1, 0, 1, 2, 0]。为了方便代码的实现,一般会往左移 [-1, 0, 1, 0, 1, 2]。
使用两个指针 pre 和 suf :
pre = -1suf = 0
str[pre] 是前缀的最后一个字符,str[suf] 是后缀的最后一个字符
如果 str[pre]==str[suf] 则两者继续向后比较,next[suf] 记录当前 pre 的位置。
1 | |
KMP算法
http://blog.ashechol.top/posts/2da0528d.html
