编写程序:利用KMP算法求子串在主串中不重叠出现的次数。(如果可以重叠呢??)
时间: 2024-10-21 09:09:45 浏览: 26
KMP算法,求子字符串位置
3星 · 编辑精心推荐
KMP算法(Knuth-Morris-Pratt 算法),也称为部分匹配算法,主要用于在一个主字符串(text)中查找给定模式(pattern)。它通过构造一个失配函数(失配表或前缀表)避免了频繁的回溯操作,提高了搜索效率。要编写程序计算主串中不重叠的子串出现次数,通常我们是在查找所有连续出现的非重叠子串是否等于给定模式。
以下是一个简单的 Python 示例,展示了如何使用 KMP 算法:
```python
def compute_occurrences(text, pattern):
# 创建失配表
prefix_table = compute_prefix_table(pattern)
count = 0
i = j = 0 # 主串索引,模式索引
while i < len(text):
if text[i] == pattern[j]:
i += 1
j += 1
elif j > 0:
j = prefix_table[j - 1]
else:
i += 1
# 如果找到一个完整的匹配
if j == len(pattern):
count += 1
j = prefix_table[j - 1] # 回到失配表对应位置继续查找
return count
# 计算前缀表(失配表)
def compute_prefix_table(pattern):
prefix_table = [0] * (len(pattern) + 1)
j = 0
for i in range(1, len(pattern)):
while j > 0 and pattern[i] != pattern[j]:
j = prefix_table[j - 1]
if pattern[i] == pattern[j]:
j += 1
prefix_table[i] = j
return prefix_table
# 使用示例
text = "ababcababc"
pattern = "abac"
print(compute_occurrences(text, pattern)) # 输出:3
阅读全文