求next [ j ] 方法: 第j位字符前,含有字符串重合字符数最多 + 1.
例题:
j: 1 2 3 4 5 6 7 8 9 10 11 12
a b a b a a a b a b a a
next[j]: 0 1 1 2 3 4 2 2 3 4 5 6
j=4 | 第四位字符数,前面有a b a; a与a重合, 1+1; |
j=5 | 第五位字符数,前面有a b a b; ab与ab重合, 2+1; |
j=6 | 第六位字符数,前面有a b a b a;aba与aba重合, 3+1; |
j=7, | 第七位字符数,前面有a b a b a a; 只有a与a重合, 1+1; |
当时我这里也有疑问,ba与ba不也重合吗, 哎,不要急,不能这么看, aba与baa不重合, 他是要包含全部数据,不能遗漏。 | |
j=8 | 第八位字符数,前面有a b a b a a a; 只有a与a重合,1+1; |
j=9 | 第九位字符数,前面有a b a b a a a b; 有ab与ab重合,记得看整体,2+1; |
j=10 | a b a b a a a b a; aba和aba重合,3+1 |
j=11 | a b a b a a a b a b; abab 和abab重合,4+1; |
j=12 | a b a b a a a b a b a; ababa和ababa重合,5+1; |
那求完next数组,接下来求nexttval:
nexttval相对next数组并不会很难,就纯属对照炒。
求 nextval[j] 方法:
相同抄底下( nextval[j] ),不同抄上面( next[j] )。
j: 1 2 3 4 5 6 7 8 9 10 11 12
a b a b a a a b a b a a
就是把 next[ j ]看成索引值,一 一与j进行对比,如果当前位置字母,与索引值所在位置的字母相同,就抄下面nextval的值下来,如果不同就抄next的值下来;记住抄的是索引值所在位置的值,不是当前位置的。
next[j]: 0 1 1 2 3 4 2 2 3 4 5 6
nextval[j]: 0 1 0 1 0 4 2 1 0 1 0 4