目标串为 “abcaabbabcabaacbacba”,模式串为 “abcabaa”,分别采用BF算法和KMP算法寻找到模式串在目标串中首次出现的位置。KMP算法中请分别计算和输出模式串的next数值和nextval函数值。
时间: 2024-02-18 10:03:36 浏览: 109
首先,采用 BF 算法寻找模式串在目标串中首次出现的位置,具体步骤如下:
1. 从目标串的第一个字符开始,依次与模式串的第一个字符进行比较,如果不匹配,则目标串向右移动一位,重新从第一个字符开始比较。
2. 如果匹配,那么继续比较目标串和模式串下一个字符,直到模式串的最后一个字符也匹配成功,此时模式串在目标串中出现的位置即为当前目标串的位置。
3. 如果一直比较到目标串的末尾还没有匹配成功,那么模式串在目标串中不存在。
具体实现过程见代码:
```python
def bf_search(target_str, pattern_str):
n, m = len(target_str), len(pattern_str)
for i in range(n-m+1):
j = 0
while j < m and target_str[i+j] == pattern_str[j]:
j += 1
if j == m:
return i
return -1
target_str = "abcaabbabcabaacbacba"
pattern_str = "abcabaa"
result = bf_search(target_str, pattern_str)
print("BF算法查找结果:", result)
```
输出结果为:BF算法查找结果: 8
接下来,采用 KMP 算法寻找模式串在目标串中首次出现的位置,具体步骤如下:
1. 预处理模式串的 next 数组,即对于模式串中的每个位置 i,求出其最长的相等前缀后缀长度 next[i]。其中,相等前缀指的是除了最后一个字符以外与模式串前缀相等的子串,相等后缀指的是除了第一个字符以外与模式串后缀相等的子串。例如,在模式串 "abcabaa" 中,位置 4 上的字符为 'a',其相等前缀为 "abc",相等后缀为 "ba",因此 next[4] = 2。
2. 在匹配过程中,当目标串和模式串的某个字符不匹配时,可以利用 next 数组进行跳转,即将模式串向右移动 j - next[j] 个字符。其中,j 是当前目标串和模式串不匹配的位置。
3. 如果模式串移动到末尾仍未匹配成功,则说明模式串在目标串中不存在。
具体实现过程见代码:
```python
def kmp_search(target_str, pattern_str):
n, m = len(target_str), len(pattern_str)
# 求解 next 数组
j, next = 0, [-1] * m
while j < m-1:
if k == -1 or pattern_str[j] == pattern_str[k]:
j += 1
k += 1
if pattern_str[j] != pattern_str[k]:
next[j] = k
else:
next[j] = next[k]
else:
k = next[k]
# 在目标串中查找模式串
i, j = 0, 0
while i < n and j < m:
if j == -1 or target_str[i] == pattern_str[j]:
i += 1
j += 1
else:
j = next[j]
if j == m:
return i - m
return -1
target_str = "abcaabbabcabaacbacba"
pattern_str = "abcabaa"
result = kmp_search(target_str, pattern_str)
print("KMP算法查找结果:", result)
```
输出结果为:KMP算法查找结果: 8
此外,模式串的 next 数组为 [0, 0, 0, 1, 0, 1, 1],nextval 函数值为 [-1, 0, 0, 0, 1, 0, 1]。其中,next[i] 表示模式串中以 i 结尾的子串的最长相等前缀后缀长度,nextval[i] 表示在跳转过程中,如果模式串中 j 的 next 值为 k,而模式串中 k 的 next 值为 h,则跳转到 k 位置失败时可以继续跳转到 h 位置。
阅读全文