爲什麼連算法都會總忘記=。=檢討,腦殼有包
關鍵點:target串(長的),partten串,若是兩者在j上不等,將partten能夠向前移動next[j]而取代只前移1
如何肯定next[j]? T與P在j-1前都相等,因此若移動後想要相等,移動後的前面部分也要與這部分T相等,三者相等:
T[j-k~j]=P[j-k~j]=P[1~K],不然移動都是冗餘的 即轉爲短串P的重複問題。
先看看如何找到子串的冗餘f(i)的長度。由於都是與1比,很簡單:若i以前的都相等,第i個也相等,則加1,不然是1,再繼續算法
a b c a b c a c a b 1 1 1 2 3 4 5 1 2 3
由於咱們要求的是不匹配的,每次計算都是前一個,向右移一下spa
0 1 1 1 2 3 4 5 1 2
因此若要匹配,能夠至少移動到k與不匹配的值比較(k-fi步)。進一步 若T與P移動後的p[k]相等,咱們知道,k前面與Tj前面是相等的,但p[k]!=t[j]則確定不匹配,與剛移動前狀況同樣,遞歸移動到兩個值不等或開頭便可,不然也都不匹配就沒有意義
常規:code
a b c a b c a d a b a b c a b c a c a b a b c a b c a c a b
更進一步,最後前的兩部能夠省略:遞歸
a b c a b c a b a b a b c a b c a c a b a b c a b c a c a b a b c a b c a c a b a b c a b c a c a b
所以移動的nextk(在j處不匹配每次能夠將下標爲nextj的移動到不匹配的Tj上進行過匹配)爲:
若是 pattern[j] != pattern[f(j)],next[j] = f(j);
若是 pattern[j] = pattern[f(j)],next[j] = next[f(j)];ip
第一次j=1,將0移動到此處
第二次j=4, 將0移動到此處
第三次j=8, 將5移動到此處
第四次j=5,將1移動到此處
第五次j=8, 將5移動到此處。結束get