KMP算法
解决在主串中快速匹配子串的问题
传统暴力算法每次失败都要从头开始,时间复杂度是$$ O(m * n) $$,效率比较差
核心思想:利用已经匹配过的信息,避免主串指针回退,从而加速匹配
KMP是如何实现优化的呢?
- 前缀表
next[i] = 当 needle[0..i]不匹配时,应跳回的下一个可匹配位置(前缀长度)
假设我们匹配:
1 | 主串: ABC ABCDAB ABCDABCDABDE |
但 KMP 会使用 next 数组得知:
已匹配的 “ABCDAB” 中前缀和后缀的最长相等部分是 “AB”(长度 2)
所以只需跳回到 needle[2] 继续匹配,而无须重来。
这大幅减少了重复比较。
为什么next数组可以帮助跳位置
因为next[i]表示的是以 i 为结尾的子串中,最长相等前后缀的长度
当子串和主串遇到不相等的字符时,子串会回到前缀的后一个位置与主串继续比较
- 构造next数组,找出模式串内每个位置 i 的最长前后缀
1 | for i := 1; i < len(s); i++ { |
- 利用next进行匹配,当遇到不匹配:使用 next 数组跳转,而不是暴力回退
1 | for i := 0; i < len(haystack); i++ { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 EurekaYu!
评论

