扩展模式匹配的BF算法(只能实现匹配主串中第一次出现的位置),使其能找出主串中出现模式串的所有位置信息
时间: 2024-05-05 13:16:15 浏览: 99
可以使用KMP算法来实现扩展模式匹配的BF算法,以实现在主串中找出所有模式串出现的位置信息。
KMP算法的核心思想是利用已匹配的前缀信息,尽量减少不必要的比较次数。具体实现如下:
1. 预处理模式串的next数组,表示模式串中每个位置之前的子串中,最长的相同前缀和后缀的长度。
2. 在主串中从左到右遍历,同时在模式串中根据next数组跳转。
3. 如果匹配成功,说明找到了一个位置,记录下来。
4. 如果匹配失败,将模式串向右移动,继续匹配。
以下是代码实现:
```python
def kmp(text, pattern):
n = len(text)
m = len(pattern)
# 预处理next数组
next = [0] * m
j = 0
for i in range(1, m):
while j > 0 and pattern[i] != pattern[j]:
j = next[j - 1]
if pattern[i] == pattern[j]:
j += 1
next[i] = j
# 匹配主串和模式串
j = 0
positions = []
for i in range(n):
while j > 0 and text[i] != pattern[j]:
j = next[j - 1]
if text[i] == pattern[j]:
j += 1
if j == m:
positions.append(i - m + 1)
j = next[j - 1]
return positions
```
使用示例:
```python
text = "ABABDABACDABABCABAB"
pattern = "ABAB"
positions = kmp(text, pattern)
print(positions) # 输出 [0, 10, 15]
```
在上面的示例中,主串为"ABABDABACDABABCABAB",模式串为"ABAB",匹配成功的位置分别是0、10和15,即主串中第1次、第2次和第3次出现模式串的位置。
阅读全文