参考教材,清华大学,严蔚敏,C语言版,数据结构
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s | a | b | a | a | b | c | a | c |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
求next[j]时,查找next[j]之前是否有前缀和后缀相等的字符串,若没有,则next[j]=1,如果存在前缀和后缀相同的字符串,则next[j]的值取前缀码的后一位。
next[1]=0
next[2]=1;j=2之前有a,没有相同的前缀和后缀
next[3]=1;j=3之前有ab,没有相同的前缀和后缀
next[4]=2;j=4 之前有aba,有相同串a,所以next[4]=1+1=2
next[5]=2;j=5之前有abaa,有相同串a,所以next[5]=1+1=2
next[6]=3;j=6之前有abaab,有相同串ab,所以next[6]=2+1=3
next[7]=1;j=7之前有abaabc,没有相同前缀和后缀,所以next[7]=1
next[8]=2;j=7之前有abaabca,有相同串a,所以next[7]=1+1=2
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s | a | b | a | a | b | c | a | c |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval[j] | 0 | 1 | 0 | 2 | 1 | 3 | 0 | 2 |
比较s[j]与s[next[j]]的值,如果s[j]=s[next[j]],nextval[j]=nextval[next[j]],不相等,则nextval[j]=next[j]
nextval[1]=0;
nextval[2]=1; s[2]=b != s[1]=a;nextval[2]=next[2]=1;
nextval[3]=0; s[3]=a == s[1]=a;nextval[3]=nextval[1]=0;
nextval[4]=2; s[4]=a != s[2]=b;nextval[4]=next[4]=2;
nextval[5]=1; s[5]=b == s[2]=b;
nextval[5]=
nextval[2]
=1;
nextval[6]=3; s[6]=c != s[3]=a;nextval[6]=next[6]=3;
nextval[7]=0; s[7]=a == s[1]=a;nextval[6]=nextval[1]=0;
nextval[8]=2; s[8]=c != s[2]=b;nextval[6]=next[8]=0;