模式串的next数组值怎么算
时间: 2024-06-14 08:03:57 浏览: 209
模式串的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数组值的计算方法,可以根据个人喜好选择使用观察法或推理法来计算。
相关问题
已知模式串求next数组
好的,您想了解如何求解已知模式串的next数组。通常,我们使用 KMP 算法来求解 next 数组。该算法的基本思想是利用已经匹配过的字符的信息,尽量减少无用的比较次数。具体来说,我们首先要根据模式串计算出 next 数组,然后使用该数组进行匹配。next 数组的计算过程如下:
1. 定义 next 数组,next[i] 表示从索引 0 到 i 的最长公共前缀和后缀子串的长度。
2. 初始时,将 next[0] 赋值为 -1,将 j 赋值为 0。
3. 遍历模式串的每个位置 i,依次计算 next[i] 的值。<br>- 如果 j = -1,或者模式串的第 i 个字符等于模式串的第 j 个字符(即 pattern[i] = pattern[j]),则令 next[i+1] = j+1,j+1 表示 j 向右移动一位;<br>- 否则,令 j = next[j],继续比较模式串的第 i 个字符和模式串的第 j 个字符,直到 j = -1 或者模式串的第 i 个字符等于模式串的第 j 个字符。
4. 当以上步骤完成后,next 数组中存储的就是模式串的最长公共前缀和后缀子串的长度。
需要注意的是,上述算法中,next 数组中的下标是从 0 开始计算的,而模式串中的下标是从 1 开始计算的。因此,当我们使用 next 数组进行匹配时,需要将匹配的起始位置初始化为 -1。
串-求next数组\n已知目标串为 abcdeabedade 模式串为:abcabca,求next数组
### 回答1:
目标串为 abcdeabedade,模式串为 abcabca,求 next 数组。
next 数组是用来优化 KMP 算法的,它表示模式串中每个前缀的最长公共前后缀的长度。具体求法如下:
1. 初始化 next 数组,next[] = -1,next[1] = 。
2. 从 i = 2 开始,依次计算 next[i]。
3. 假设已知 next[1] 到 next[i-1],现在要求 next[i]。
4. 如果模式串的第 i 个字符和前面的最长公共前后缀的下一个字符相等,那么 next[i] = next[i-1] + 1。
5. 否则,就需要不断回溯,直到找到一个前缀和后缀相等的位置,或者回溯到了模式串的开头。具体做法是,将 next[i-1] 的值赋给 j,然后不断向前回溯,直到找到一个位置 k,使得模式串的前 k 个字符和后 k 个字符相等,或者回溯到了模式串的开头。此时,next[i] = k。
6. 重复步骤 2 到 5,直到求出 next[n],其中 n 是模式串的长度。
对于本题,模式串为 abcabca,可以按照上述方法求出 next 数组如下:
next[] = -1,next[1] = ,next[2] = ,next[3] = ,next[4] = 1,next[5] = 2,next[6] = 3,next[7] = 1。
注意,next 数组的下标从 开始,而模式串的下标从 1 开始。
### 回答2:
首先,需要对模式串进行预处理,生成next数组。next数组是指在匹配字符串中,当当前字符与模式串中的字符不匹配时,模式串应该向右移动的最短距离。
该串的next数组为:
a b c a b c a
0 0 0 1 2 3 4
其中,第一个字符的next值为0,第二个字符之前的next值为1,第三个字符之前的next值为2,以此类推。
从第四个字符开始,next值需要根据前面的字符来进行计算。
对于abcabca这个模式串,以第四个字符a为例,前三个字符组成的前缀为abc,后三个字符组成的后缀也为abc。因此,next值为3,表示当第4个字符与目标串的第4个字符不匹配时,模式串应该向右移动3个位置。
同理,对于第五个字符b,前四个字符组成的前缀为abca,后四个字符组成的后缀为bcab,都不匹配,需要继续向前找。发现前三个字符abc和最后三个字符bca匹配,因此next值为3。
对于第六个字符c,前五个字符组成的前缀为abcab,后五个字符组成的后缀为cabca,都不匹配,需要同样向前找到前三个字符abc和最后三个字符bca匹配,因此next值为3。
以此类推,可以得到完整的next数组。
### 回答3:
首先需要明确什么是next数组。next数组也称为部分匹配值数组,用来表示模式串中前缀和后缀的最长公共部分的长度。
在求解next数组时,我们可以使用模式串自身的匹配信息来推导next值。具体算法如下:
1.初始化next数组,令next[0]=-1,next[1]=0。
2.令k=0,j=1。
3.循环计算next值:
(a) 如果j等于0或者p[k]等于p[j],则令next[j+1]=k+1,k=next[j+1],j=j+1。
(b) 否则,令k=next[k],直到k=0或者p[k]=p[j],然后令next[j+1]=k+1,k=next[j+1],j=j+1。
4.计算完成后,返回next数组。
以本题为例,要求模式串abcabca的next数组,按照上述算法:
1.先初始化next数组,令next[0]=-1,next[1]=0。
2.令k=0,j=1。
3.循环计算next值:
(a) 当j=2时,由于此时p[k]=a,p[j]=b,不匹配,因此令k=next[k]=-1,j=j+1。
(b) 当j=3时,由于此时p[k]=-1,p[j]=c,不匹配,因此令k=next[k]=-1,j=j+1。
(c) 当j=4时,由于此时p[k]=-1,p[j]=a,不匹配,因此令k=next[k]=-1,j=j+1。
(d) 当j=5时,由于此时p[k]=-1,p[j]=b,不匹配,因此令k=next[k]=-1,j=j+1。
(e) 当j=6时,由于此时p[k]=-1,p[j]=c,不匹配,因此令k=next[k]=-1,j=j+1。
(f) 当j=7时,由于此时p[k]=-1,p[j]=a,与p[1]=a匹配成功,因此令next[j+1]=0,k=next[j+1]=0,j=j+1。
4.计算完成后,得到的next数组为[-1, 0, -1, -1, -1, -1, -1, 0]。
因此,模式串abcabca的next数组为[-1, 0, -1, -1, -1, -1, -1, 0]。
阅读全文