KMP算法中的NEXT數組的應用

KMP算法中的關鍵部分就是next數組,沒有這個數組的維護,KMP算法根本沒法實現。

下面來簡單講一下他的用途,這兩天會持續更新:


1、求一個字符串中最長子串:(在保證這個字符串是由這些子串連續構成的情況下)

比如說一個子串:abcabcabc,目測最長子串長度爲3。在求next數組的時候,每個字符的值依次爲:-1, 0, 0, 0, 1, 2, 3, 4, 5, 6。這時候你會發現,明明字符串長度只有9啊,爲什麼我給出的next[i]會有10個數呢?第10個值,也就是6,是在字符串最後一個字符後面的假設的一個位置。也就是說,從第10個位置往前找,字符串前綴和後綴長度一致且相等的子串長度爲6,,即abcabc。那麼這個時候,最長子串的長度就是len - next[len]了,即3。在此不作證明,略去。


2、求一個字符串所有前綴字符和後綴字符匹配的長度:

       說得有點繞,拿一個例子來說明:ababcababababcabab。在這個字符串中,符合要求的長度有2,4,9,18,即從最前往後K個字符與從最後往前K個字符一樣。那你可能要說,在求next數組的過程中,我求出來的不是前綴字符和後綴字符匹配長度的最大值嗎?現在要求所有值怎麼求?很簡單,想一下就可以發現,長度小的匹配一定是包含在長度大的匹配串中的,就拿上個例子,忽略自身18,最長長度是9:那麼,在ababcabab中,是不是abab,ab也包括在裏面?對啦,這其實是一個遞歸的思想,從大的匹配裏可以找的更小的匹配。再考慮極端情況下:abcdefghijklmn,這14個字符裏面,符合長度要求的就只有14了,遞歸已經到頭了。每個子串長度的求法和第一種一樣,就不贅述了。


在看完這些講解後,做一些題體會一下吧。:)

練習題:POJ 2406, 2752

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章