next数组代码
时间: 2023-07-03 21:07:22 浏览: 62
next数组是KMP算法中的一个重要概念,用于记录模式串中每个位置之前的最长公共前缀和后缀的长度。下面是next数组的求法:
```python
def get_next(pattern):
n = len(pattern)
next = [0] * n
j = 0
for i in range(1, n):
while j > 0 and pattern[i] != pattern[j]:
j = next[j-1]
if pattern[i] == pattern[j]:
j += 1
next[i] = j
return next
```
其中,pattern是模式串,n是模式串的长度,next是next数组,j表示当前已匹配的前缀的末尾位置。
以上代码的时间复杂度为O(n),可以在较短的时间内求出next数组。
相关问题
代码实现 KMP 求next数组
好的,我可以回答这个问题。KMP算法是一种字符串匹配算法,它可以在O(n+m)的时间复杂度内解决字符串匹配问题。其中,求next数组是KMP算法中的核心步骤之一。 下面是实现KMP算法求next数组的代码:
```
void getNext(string pattern, vector<int>& next) {
int len = pattern.size();
next[0] = -1;
int i = 0, j = -1;
while(i < len - 1) {
if(j == -1 || pattern[i] == pattern[j]) {
i++, j++;
next[i] = j;
} else {
j = next[j];
}
}
}
```
在这里,我们通过循环遍历的方式计算next数组。其中,变量i表示前缀指针,j表示后缀指针,next数组的下标从1开始。当pattern[i]和pattern[j]相等时,说明当前位置匹配成功,我们可以将next[i+1]的值设置为j+1。如果不匹配,则向前跳转到next[j]的位置,继续进行匹配。最终得到的next数组即为所求。
kmp算法next数组
KMP算法中的nextval数组是next数组的一个扩展版本,用于优化模式串的匹配过程。nextval数组的计算步骤如下:
1. 首先,计算出next数组的值,其中定义next[1]=0,next=1。
2. 接着,定义nextval=0。
3. 然后,对于模式串的第j个字符(j>1),比较它与第next[j]个字符是否相等。如果相等,模式串第j个字符的nextval值等于第next[j]个字符的nextval值。
4. 如果不相等,模式串第j个字符的nextval值等于其next数组值。即,如果T[j]=T[next[j]],则nextval[j]=nextval[next[j]]。否则,nextval[j]=next[j]。
根据上述步骤,可以手动求解kmp算法的nextval数组。在代码实现中,通常将字符串的下标从0开始,因此可以采用nextval=-1,nextval=0的方式定义nextval数组。你可以通过输出nextval数组来查看结果。如果想输出以"0 1"开头的nextval数组值,只需修改输出语句为cout<<nextval[i]<<" 1";其余代码保持不变。<span class="em">1</span><span class="em">2</span><span class="em">3</span>