基础算法5: KMP
KMP 字符串匹配算法
原理介绍
KMP 算法是一种高效的字符串匹配算法,其核心思想是利用已经匹配过的部分避免主串指针回溯,将时间复杂度由朴素匹配的 O(n*m) 降至 O(n+m)。
next 数组的定义
next[i] 表示模式串 P[0 ... i] 这个子串中,最长的相等前缀和后缀的长度(前缀不能为整个子串)。
例如:P = "ababc"
next[0] = 0(单字符无真前后缀)next[1] = 0(”ab” 无相等前后缀)next[2] = 1(”aba” 前缀 “a”,后缀 “a”)next[3] = 2(”abab” 前缀 “ab”,后缀 “ab”)next[4] = 0(”ababc” 无相等前后缀)
当匹配失败时,next[i-1] 告诉我们可以跳过多少个字符继续匹配,避免主串指针回退。
算法流程
- 构建 next 数组
通过双指针i(后缀末尾)和j(前缀长度)遍历模式串,若不匹配,j回退到next[j-1]。 - 匹配过程
主串指针i和模式串指针k依次比较,失配时k回退到next[k-1],匹配成功时记录起始位置,并继续查找下一个匹配。
以下附上代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 yyx的个人主页!