对于字符串“abababca”,它的next如下表所示:
void get_next(SString T, int* next) {
int i = 1, j = 0;
next[1] = 0; // next[1]的值总是0
while (i < T.length) {
if (j == 0 || T.ch[i] == T.ch[j]) { // 如果j处于0位或者,俩字符相等
++i; ++j; // 继续比较后继字符
next[i] = j; // 当前的j就是next的值
} else {
j = next[j]; // 若字符不相等,则j利用next[j]进行回溯
}
}
}
考试手算:前缀后缀匹配
算法简单的语言描述一下:
- 当我们在做KMP算法时,会设置两个指针,i和j。i初始值位1,j初始值位0。
- 在KMP算法中,i在算法过程中不会减小且next[1] = 0。
- 当j = 0 或者 两个比较的字符相同时,跳过,++i,++j,且此时next[i]的值恰好为j。
- 当两个字符不同时,i不发生变化,j回溯到next[j]的位置。
对于字符串“ababaa”,它的next如下表所示:
void get_nextval(SString T, int nextval[]) {
int i = 1, j = 0;
nextval[1] = 0;
while(i < T.length) {
if(j==0 || T.ch[i] == T.ch[j]) {
++i; ++j;
if (T.ch[i] != T.ch[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else {
j = nextval[j];
}
}
}
nextval数组解决了,j回溯之后仍然字符不相等的漏洞
考试手算:先求next数组,再求nextval数组
算法简单理解:其实就多了一个检查是否回溯之后仍然无效
标签:字符,ch,nextval,++,next,算法,KMP From: https://www.cnblogs.com/moguw/p/18105561