1、 用KMP法求得的下列模式串的每个字符对应的next和nextval函数值。(手工计算后用程序复核一下结果) 1) t1=‘aaab’ 2) t2=‘abcabaa’ 3) t3=‘adabbadada’
时间: 2024-11-21 08:37:53 浏览: 31
KMP(Knuth-Pratt)算法用于字符串匹配,通过构建部分匹配表(next数组),避免了回溯过程。对于给定的模式串t,next[i]表示从模式串的第一个位置i开始匹配失败时,需要跳过的字符数。nextval是一个辅助变量,帮助计算next数组。
以下是每个模式串`t1`, `t2`, 和 `t3` 的next数组计算步骤:
1) 对于`t1='aaab'`:
- 初始化:next[0] = 0, nextval = 0
- 第1次循环: 'a'(索引1), 'a'(索引2),匹配成功,next[1]=1
- 第2次循环: 'a'(索引3), 比较't1'[2]='a',匹配成功,next[2]=1 (因为之前已经匹配过)
- 第3次循环: 'b'(索引4), 比较't1'[3]='b',不匹配,尝试从下一个位置开始匹配,next[3]=2 (因为前两个'a'匹配)
- 初始化:next[0] = 0, nextval = 0
- 第1次循环: 'a'(索引1), 'b'(索引2), 'c'(索引3),都不匹配,next[1] = 0, next[2] = 0, next[3] = 0
- 第4次循环: 'a'(索引4), 比较't2'[4]='a',匹配成功,next[4]=1
- 然后比较't2'[5]='b', 'a', 'a',最后找到'miss'的位置,next[5]=4 (从头开始找直到找到第一个不匹配的位置)
- 结果:next数组为 [0, 0, 0, 1, 4]
3) 对于`t3='adabbadada'`:
- 初始化:next[0] = 0, nextval = 0
- 第1次循环: 'a'(索引1), 'd'(索引2), 匹配失败,next[1]=0, next[2]=1
- 接着对比'd', 'a', 'b', 'b', 'a', 'd',找到'miss'的位置是2,因为'd'之后没有连续的'a',所以next[3]=2
- 继续:'d'(索引6), 'a'(索引7), 匹配失败,但由于之前有连续的'da',所以next[6]=5 (从最后一个'da'后的'b'开始查找)
- 结果:next数组为 [0, 1, 2, 2, 0, 5]
为了复核结果,你可以编写一个简单的Python程序来计算这些next值,并打印出来:
```python
def compute_next(t):
next_array = [0]
next_val = 0
for i in range(1, len(t)):
while next_val > 0 and t[next_val] != t[i]:
next_val = next_array[next_val]
if t[next_val] == t[i]:
next_val += 1
else:
next_array.append(next_val)
return next_array
# 测试模式串
patterns = ['aaab', 'abcabaa', 'adabbadada']
for pattern in patterns:
print(f"{pattern}: {compute_next(pattern)}")
```
运行这个程序,你会得到上述计算的结果。如果与手动计算一致,则说明计算无误。
阅读全文