天天看點

KMP中next之我的個人了解

為什麼len-next[len]就是最短循環節

例如有p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12的長度為12的串。

KMP中next之我的個人了解

假設第13位的next對應的是8,從kmp角度來說意思就是:

p1 p2 p3 p4 p5 p6 p7 p8= p5 p6 p7 p8 p9 p10 p11 p12,這時我們可以找到這樣一種關系,p1 p2 p3 p4= p5 p6 p7 p8=p9 p10 p11 p12,這樣我們可以把這個長度為12的串每逢4個字元拆開,且才開後的每個子串都相等,且子串間是連續的,注意是“連續”的。是以可以拆成12/4個的串。答案為3。

KMP中next之我的個人了解

假設第13位的next對應的是7,從kmp角度來說意思就是:

p1 p2 p3 p4 p5 p6 p7=p6 p7 p8 p9 p10 p11 p12,現在我們再通過這個等式,看看是否能找到一個子串像上例一樣等分該串。很明顯找不到。如果能找到了話,該字串的長度必然要等于5,因為等式的右邊是從p6開始有循環的效果,是以p1 p2 p3 p4 p5必然要獨立成串,才可以和後面的串進行比對。你也可以這樣想,如果p1 p2 p3 p4可以獨立成串,那p5就沒人跟他比對,因為等式的右邊是從p6開始的,要注意,你得出的子串是可以把母串連續分開的,如果隻取p1 p2 p3 p4那麼他隻能等于p6 p7 p8 p9,很明顯,這樣做少了p5,沒有把母串“連續”分開。但是如果p1 p2 p3 p4 p5作為字串,少可以保證分開後子串間是連續的,可是母串的長度為12,不可能逢5分開。答案隻能是1。

KMP中next之我的個人了解

假設第13位的next對應的是5,從kmp角度來說意思就是:

p1 p2 p3 p4 p5= p8 p9 p10 p11 p12,這下悲劇了,連p6 p7都沒有,根本就談不上找到一個連續的子串

KMP中next之我的個人了解

假設第13位的next對應的是6,從kmp角度來說意思就是:

p1 p2 p3 p4 p5 p6= p7 p8 p9 p10 p11 p12。這個就又太好了,根本就不要去找,自己本來就連續了,意思就是 p7 p8 p9 p10 p11 p12可以用p1 p2 p3 p4 p5 p6來表示嘛~~~是以答案是2=12/6;

KMP中next之我的個人了解

換一種說法說可以的:

假設第13位的next對應的是10,從next角度來說意思就是:

當第13位不比對時,其實不可能比對到第13位,我們先假設有這個位,那麼j就要下移到p11,(注意我的next是從-1開始的,每個都少了1,書上都是從0開始的)也就是說我把這個串啊後移兩位跟原來的串的對應的位置的字元都會相等,那我再移兩位也肯定會相等,是以這個串可以每逢2為一子串。而且長度為12,正好可以逢2分開。

KMP中next之我的個人了解

綜上所述:一個串能否分為若幹個相等連續的子串。把母串長n減去next[n+1],注意next要從-1開始算起,意思就是說我每逢長度為(n-next[n+1])分為一子串,頭若幹個的子串必然連續且相等,頭幾個還不行,是以要看看   n/(n-next[n+1]) 意思就是說我每逢(n-next[n+1])這麼多個為一子串能否把母串給完整地分開,如果是整數可以分成n/(n-next[n+1])個。如果是小數,說明不能按這樣分,那母串就不能分成若幹相等連續的子串了……