KMP 算法的next数组求法:
void getNext(char* ptn,int next[]){
int i=0;
int j=-1;
int len=strlen(ptn);
next[0]=-1;
while(i<len){
if(-1==j||ptn[i]==ptn[j]){
i++;j++;
next[i]=j;
}else{
j=next[j];
}
}
}
怎么理解呢?
首先我们需要知道这几点:
- 如果(-1==j||ptn[i]==ptn[j])这个条件不成立,j会从右边往左按照j_{k+1}=next[j_{k}]更新自己的值。
- 如果(-1==j||ptn[i]==ptn[j])这个条件成立,此时可以计算next[i+1]的值为j+1。
我看看这个过程:
当i=6进入while循环之前,j=next[6]。当i=6进入while 循环时执行,
ptn_src: A_0 A_1 A_2 A_3 A_4 A_5 A_6 A_7
ptn_ptn A_0 A_1 A_2 A_3 A_4 A_5
如果ptn[6]!=ptn[next[6]], 那么下一步比较的是ptn[6]!=ptn[next[next[6]]],如果还不成立继续比较ptn[6]!=ptn[next[next[next[6]]]]直到条件成立或者j=0。