【kmp算法代码】KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,用于在一个主串中查找一个模式串的出现位置。与传统的暴力匹配算法相比,KMP算法通过预处理模式串,构建部分匹配表(也称为失败函数或前缀函数),从而避免了不必要的字符比较,提高了匹配效率。
一、KMP算法核心思想
1. 预处理阶段:构建一个数组`next[]`,表示当在某个位置匹配失败时,模式串应跳转到哪个位置继续匹配。
2. 匹配阶段:使用`next[]`数组进行高效匹配,避免重复比较。
二、KMP算法步骤
| 步骤 | 描述 |
| 1 | 构建模式串的`next[]`数组 |
| 2 | 初始化两个指针i(主串索引)、j(模式串索引) |
| 3 | 当i < 主串长度且j < 模式串长度时循环 |
| 4 | 若主串[i] == 模式串[j],则i和j同时后移 |
| 5 | 否则,若j > 0,则j = next[j-1];否则i后移 |
| 6 | 若j等于模式串长度,说明找到匹配位置 |
三、KMP算法代码实现(Python)
```python
def kmp_search(text, pattern):
def build_next(pattern):
n = len(pattern)
next_array = [0] n
j = 0
for i in range(1, n):
while j > 0 and pattern[i] != pattern[j]:
j = next_array[j - 1
if pattern[i] == pattern[j]:
j += 1
next_array[i] = j
else:
next_array[i] = 0
return next_array
next_array = build_next(pattern)
i = j = 0
n = len(text)
m = len(pattern)
result = [
while i < n:
if text[i] == pattern[j]:
i += 1
j += 1
if j == m:
result.append(i - j)
j = next_array[j - 1
elif i < n and text[i] != pattern[j]:
if j != 0:
j = next_array[j - 1
else:
i += 1
return result
```
四、示例说明
假设主串为 `"ABABABA"`,模式串为 `"ABA"`,则:
- `next[]` 数组为 `[0, 0, 1]`
- 匹配结果为 `[0, 2, 4]`
五、KMP算法优点
| 优点 | 说明 |
| 高效 | 时间复杂度为 O(n + m),其中n为主串长度,m为模式串长度 |
| 避免回溯 | 不需要回溯主串,只需根据`next[]`调整模式串位置 |
| 稳定性 | 对于重复模式有良好表现 |
六、KMP算法缺点
| 缺点 | 说明 |
| 实现复杂 | 相比暴力算法,逻辑较复杂 |
| 内存占用 | 需要额外存储`next[]`数组 |
| 对小模式串效果不明显 | 对于短模式串,可能不如暴力法快 |
七、总结
KMP算法是字符串匹配领域的重要算法之一,通过预处理模式串,显著提升了匹配效率。虽然实现相对复杂,但在大规模文本搜索中具有显著优势。对于实际应用,可根据具体情况选择是否使用KMP算法。


