1、 编程实现:设主串S=”abcabcacb”,子串T=”abcac”,分别用BF算法和KMP算法找到子串T在主串S中的位置。
时间: 2024-10-11 21:15:42 浏览: 50
在编程中,要使用BF(Brute Force,暴力搜索)和KMP(Knuth-Pratt 算法)找到子串 `T` 在主串 `S` 中的位置,我们可以这样实现:
**BF算法(暴力搜索)**:
这是一种简单但效率较低的方法。它从头开始,逐字符地检查每个可能的起始位置,直到找到子串 `T` 或遍历完主串。
```python
def brute_force_search(S, T):
for i in range(len(S) - len(T) + 1): # 遍历所有可能的起始位置
if S[i:i+len(T)] == T: # 如果匹配,返回起始位置
return i
return -1 # 如果没有找到,返回 -1 表示未在主串中
# 示例
S = "abcabcacb"
T = "abcac"
position = brute_force_search(S, T)
```
**KMP算法**:
KMP算法是一种更高效的字符串匹配算法,它通过构建部分匹配表来避免回溯。首先计算出子串前缀的最长公共前后缀,然后在主串和子串上同步移动指针。
```python
def build_lps(T):
lps = [0] * len(T)
j = 0
for i in range(1, len(T)):
while j > 0 and T[i] != T[j]:
j = lps[j - 1]
if T[i] == T[j]:
j += 1
lps[i] = j
return lps
def kmp_search(S, T):
lps = build_lps(T)
i = j = 0
while i < len(S):
if S[i] == T[j]:
i += 1
j += 1
elif j > 0:
j = lps[j - 1]
else:
i += 1
return j if j == len(T) else -1 # 如果匹配到,返回子串长度;否则返回 -1
# 示例
S = "abcabcacb"
T = "abcac"
position = kmp_search(S, T)
```
阅读全文