首页 >> 经验问答 >

问kmp算法代码

2025-11-25 15:03:47

答

【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算法。

 

相关阅读

标签: kmp算法代码
最新文章