模式串的next数组值怎么算
时间: 2024-06-14 10:03:57 浏览: 279
模式串的next数组值可以通过两种方法来计算:观察法和推理法。
1. 观察法:
观察法是一种直接观察模式串中的重复子串来计算next数组值的方法。具体步骤如下:
- 首先,将next数组的首个位置的值设为-1。
- 然后,从第二个位置开始,依次计算每个位置的next值。
- 对于第i个位置,我们需要找到在s[i]之前的字符串中的重复子串,并计算其长度。
- 重复子串的长度可以通过观察模式串中的重复部分来得到,即找到一个最长的相同前缀和后缀。
- 将这个最长相同前缀和后缀的长度赋值给next[i]。
2. 推理法:
推理法是一种根据已知的next数组值来推理下一个位置的next值的方法。具体步骤如下:
- 首先,将next数组的首个位置的值设为-1。
- 然后,从第二个位置开始,依次计算每个位置的next值。
- 对于第i个位置,我们需要根据已知的next数组值来推理出next[i]的值。
- 根据已知的next数组值,我们可以得到一个最长的相同前缀和后缀的长度,假设为k。
- 如果s[i]和s[k]相等,则next[i]的值为k+1。
- 如果s[i]和s[k]不相等,则我们需要继续向前推理,找到一个更短的相同前缀和后缀的长度,直到找到一个相等的字符或者到达字符串的开头。
- 将这个最长相同前缀和后缀的长度赋值给next[i]。
以上是模式串的next数组值的计算方法,可以根据个人喜好选择使用观察法或推理法来计算。
相关问题
计算模式串“abbaabaada”的next数组值
计算模式串 "abbaabaada" 的 next 数组值是指在 KMP 算法中用于查找模式串在一个主串中的位置的一种辅助数据结构。KMP 算法主要用于字符串匹配,通过 next 数组可以帮助我们在遇到错误情况(比如某字符不匹配)时快速跳过部分已匹配的部分,避免重复搜索。
next 数组的构建规则基于模式串的前缀和后缀最长公共前后缀长度,目的是在发生不匹配时,根据这个长度决定模式串向左移动多少位。对于 "abbaabaada",我们首先初始化一个空的 next 数组:
```
next = [0, -1, -1, -1, 0] (对应 abbaa 的状态)
```
接下来逐个填充 next 数组:
- 当 i=0 时,没有前缀,所以 next[0]=0;
- i=1 时,尝试将 a 匹配给 b,失败,由于下一个字符也是 b,所以 next[1]=-1 表示匹配失败需要回溯一位;
- i=2,3 时,连续两个 a 和 b 都无法构成最长公共前后缀,所以 next[2], next[3] 也都是 -1;
- i=4 时,找到一个完整的 abba 后缀,其与自身前缀有相同的后缀,即 next[4]=4;
- i=5,6,7 分别是 'b', 'a', 'd',它们都不构成新的公共前后缀,所以 next[5] = next[4] + 1 = 4, next[6] = next[5] + 1 = 5, next[7] = next[5] + 1 = 5。
最终的 next 数组为:
```
next = [0, -1, -1, -1, 0, 4, 5, 5]
```
已知模式串求next数组
next数组是用于KMP算法的,可以用于快速匹配模式串和文本串。next数组表示模式串中每个字符前面的子串中,最长的相等前缀和后缀的长度。具体求解方法如下:
1. 初始化next数组,next[0]=-1,next[1]=0。
2. i从2开始遍历模式串。
3. 如果模式串中i-1位置的字符与前面的相等字符的后一个字符相等,则next[i]=next[i-1]+1。
4. 如果模式串中i-1位置的字符与前面的相等字符的后一个字符不相等,则需要不断回溯,找到最长的相等前缀和后缀的长度。具体做法是,将i-1位置的字符的前一个字符的next值赋给j,然后在循环中不断回溯,直到找到相等的字符或者回溯到了整个模式串的起始位置。如果找到了相等的字符,就将j+1赋给next[i],否则将next[i]赋为0。
5. 返回next数组。
下面是Python代码实现:
```python
def get_next(pattern):
n = len(pattern)
next = [-1] * n
i, j = 0, -1
while i < n - 1:
if j == -1 or pattern[i] == pattern[j]:
i += 1
j += 1
next[i] = j
else:
j = next[j]
return next
```
其中,i表示模式串中当前要求next值的位置,j表示当前相等前缀和后缀的长度。如果j=-1,表示没有相等前缀和后缀,那么就需要将i和j都向后移动一位。如果pattern[i]==pattern[j],表示当前字符和相等前缀的下一个字符相等,那么就可以将next[i]=j+1。否则,就需要回溯,将j的值更新为next[j],继续寻找相等前缀和后缀。
阅读全文
相关推荐
















