j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
a | b | c | a | b | c | d | |
next[j] | 0 | 1 | 1 | 1 | 2 | 3 | 4 |
要求j=7的时候,next数组为多少,j=7的时候,就是看i=6的时候前缀和后缀的关系(因为求7的时候,和7没有关系,和7的前面有关系)
当i=6的时候,j=3,KMP(看门牌算法)
就看j=3和j=6对应的两个字符相不相等,相等,就j+1,就是next[7],如果不相等,就继续看3对应的相不相等。
因为
j=6的next为3,则红色标注的两个字符一定相等,如果j=6和j=3两个字符再对应相等的话,就绿色标注的也相等,依此类推。
void get_next(SString,int &next[])
{
i=1;next[1]=0;j=0;
while(i<T.length){
if(j==0 || T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}
else{
j=next[j];
}
}
}