编程题 题目内容:设目标串s='abcdeabcdf,模式串t='abcdf',使用 BF 算法和 KMP 算法判断模式串t与目标串s是否匹配。(画出匹配过程) 输入格式:…… 输出格式:…… 输出样例:……
时间: 2024-11-03 15:15:48 浏览: 33
在编程中,BF(Brute Force)即暴力搜索算法和KMP(Knuth-Morris-Pratt)算法都是用于字符串匹配的经典技术。这里我们将分别展示这两种算法的实现,并解释它们如何应用于找出模式串`t='abcdf'`在目标串`s='abcdeabcdf'`中的位置。
**BF(暴力搜索)**:
这是一种简单的逐位比较方法,从头开始,如果遇到第一个不匹配的字符,就移动模式串的位置重新开始。这种方法在最坏的情况下时间复杂度是O(nm),其中n是目标串长度,m是模式串长度。
```python
def bf_search(s, t):
n, m = len(s), len(t)
for i in range(n - m + 1):
if s[i:i+m] == t:
return i
return -1
s = "abcdeabcdf"
t = "abcdf"
bf_result = bf_search(s, t)
if bf_result != -1:
print(f"BF Match found at index {bf_result}")
else:
print("No match found with BF")
```
**KMP(KMP算法)**:
KMP算法通过构建失配表提前知道在发生错误时模式串应跳转到哪里,避免了不必要的回溯。失配表记录了模式串前缀和其最长公共前后缀的长度。
```python
def compute_lps(t):
lps = [0] * len(t)
j = 0
for i in range(1, len(t)):
if t[i] == t[j]:
j += 1
lps[i] = j
else:
if j != 0:
j = lps[j-1]
else:
lps[i] = 0
return lps
def kmp_search(s, t):
lps = compute_lps(t)
i, j = 0, 0
while i < len(s) and j < len(t):
if s[i] == t[j]:
i, j = i + 1, j + 1
elif i < j:
i = i + lps[j-1]
else:
j = lps[j-1]
if j == len(t):
return i - j
return -1
kmp_result = kmp_search(s, t)
if kmp_result != -1:
print(f"KMP Match found at index {kmp_result}")
else:
print("No match found with KMP")
```
对于这个例子,如果你运行上述代码,你会看到BF方法会找到两个匹配点(索引6和15),而KMP方法只找到一个匹配点(索引6)。这是因为KMP算法更为高效,在处理大量数据时性能更好。
阅读全文