bf字符串匹配Python代码实现 代码分析
时间: 2024-07-04 13:01:18 浏览: 97
BF (Boyer-Moore) 字符串匹配算法是一种高效的文本搜索算法,它通过预处理模式串(即待查找的子串),避免在不匹配的情况下在主串中回溯。下面是使用 Python 实现的 Boyer-Moore 算法的一个简单版本:
```python
def bad_char_search(pattern, text):
m = len(pattern)
n = len(text)
lps = * m # longest proper prefix suffix (LPSPS)
for i in range(1, m):
j = lps[i - 1]
while j > 0 and pattern[j] != pattern[i]:
j = lps[j - 1]
if pattern[j] == pattern[i]:
j += 1
lps[i] = j
i = 0
while i < n:
j = m - 1
while j >= 0 and text[i + j] == pattern[j]:
j -= 1
if j < 0:
print(f"Pattern found at index {i}")
i += m
else:
i += lps[j + 1]
# 示例用法
pattern = "ABCD"
text = "ADAMABCDAB"
bad_char_search(pattern, text)
```
代码分析:
1. 首先初始化两个指针,`m` 表示模式串长度,`n` 表示主串长度。`lps` 数组用于存储模式串的后缀和前缀公共部分的信息。
2. 计算 Look-Aside-Table (LPS)。这个循环计算了 LPS 列表,使得 `lps[i]` 表示以模式串第 `i+1` 个字符结尾的最长前缀,该前缀也出现在模式串中。
3. `while` 循环内,找到 `pattern[i]` 在 `pattern[j]` 后面的位置 `j`,更新 `lps[i]`。
4. 主循环中,从主串的开始处开始匹配。如果找到一个匹配,`j < 0`,则找到了模式串,输出索引并向前移动 `m` 个字符继续搜索。否则,根据 `lps[j + 1]` 值向右移动。
5. 递归调用 `bad_char_search`,直到遍历完整个主串。
阅读全文