如何用c++求kmp的next数组,请详细注释
时间: 2023-05-27 13:08:08 浏览: 87
KMP算法的核心是求解next数组,下面是一份注释详细的C代码实现:
```c
void getNext(char* p, int* next) {
int len = strlen(p);
int i = 0, j = -1;
next[0] = -1;
while (i < len) {
if (j == -1 || p[i] == p[j]) { // 如果j=-1或者当前字符匹配成功
++i;
++j;
next[i] = j;
} else {
j = next[j]; // 失配时,j跳到next[j]
}
}
}
```
其中,p是模式串,next是next数组。
算法流程如下:
1. 初始化i为0,j为-1,next[0]=-1,表示从模式串的第一个字符开始匹配。
2. 在while循环中,如果j=-1或者当前字符匹配成功,则i和j都加1,并将next[i]赋值为j。
3. 如果当前字符匹配失败,则j跳到next[j]的位置,即next[j]的值表示在模式串中,从第0个字符到第j-1个字符组成的子串的最长相同前缀后缀长度,因此j直接跳到这个位置。
4. 最后返回next数组即可。
举个例子,假设模式串为“ababc”,则next数组为[-1, 0, 0, 1, 2, 0]。