1、KMP算法next的讲解
其实我相信大部分人并不是不懂KMP的原理而是不懂next【】数组到底怎么搞出来的,查资料发现他们都是一笔带过,然后好不容易才找到一个讲的很详细的,但是发现是用图解释,但是在详细也很难理解;
因此,我在这里直接推荐你们看一个视频,一遍不懂就多看几遍,之后不会恍然大悟,醍醐灌顶;给我冲兄弟们; b站:https://www.bilibili.com/video/BV16X4y137qw
//KMP算法解决串的匹配;
int StrIndexKMP(LinearString s,LinearString t){
void getNext(LinearString t,int next[]);
int next[t->length];
int i = 0,j = 0;
getNext(t,next);
while (i < s->length && j < t->length){
if ( j == -1 || s->elem[i] == t->elem[j]){
i++;
j++;
}else{
j = next[j];
}
}
if ( j >= t->length){
return i - t->length;
}else{
return -1;
}
}
void getNext(LinearString t,int next[]){
int j,k; // j始终指向t中的元素,并且从头一直移动到尾,不发生重返的过程,k代表着最大公共前缀的长度
//我们约定第一个元素的最长公共前缀长度为-1,其实没有公共前缀的元素约定为0;
next[0] = -1;
j = 0;
k = -1;
/**
* 实现next的原理就是通过递推的方法,知道next[j],从而起的next[j+1]
* 并且如果 Pk = Pj,那么有next[j+1] = k+1;
* 如果k = -1,那就意味着next[j] = 1;就是没有公共前缀
*/
while( j < t->length-1){
// k如果等于 -1那么就代表着已经回溯到了next[0],那就意味着,next[j+1]的最长公共前缀一定是0的;
// 如果是t->elem[k] == t->elem[j],那么及时满足这个条件Pk = Pj,那么有next[j+1] = k+1;
if ( k == -1 || t->elem[k] == t->elem[j]){
j++;
k++;
next[j] = k;
}else{
k = next[k];
}
}
}