相信對於kmp演算法本身大家都理解,最難理解的就是這個next陣列的求解了。
這是**
/* p 為模式串,下標從 0 開始 */
void getnext(string p, int next)
else
j = next[j];
}}
根據我的理解,i 和 j 可以看成是兩個指標,用來跟蹤當前匹配的位置。
可以發現 i 是會不斷的往前推進的,頂多就是動,而 j 有時候是需要往後退的,那什麼時候往前,什麼時候後退,一次退多少是要確定的。
(1)j 前進的條件:
如果p[i] == p[j] 的時候,說明可能匹配到了乙個字首,這個時候得看看字首會不會更長,所以 i 和 j都忘前推進。並且當p[i] == p[j]時,next[i] 的值是等於j的,為什麼呢?可以理解為 j 是最長字首,假如說剛好匹配了乙個了,按理說j不應該要等於1 嗎,為什麼j還是等於0呢,是因為當目標字串和源字串發生失配的時候,要將失配的哪一位換成目標字串的另外一位開頭來匹配,對應為陣列的下標,所以需要-1.
(2)j 後退是為什麼?
p[i] != p[j] 的時候。其實在還沒有匹配到相等的時候,j 的值是一直在-1 和 0 之間 取值的,當p[i] != p[j]的時候,j=next[j] 結果是-1 ,然後下一次迴圈由於j=-1 ,j++, j又等於0了,在這個過程中i 是不斷的往後的。
加入在之前匹配到了幾個字首了,比如j=3 next[3]=2; 當再次p[i] != p[j]的時候,j=next[3]=2。
這是我的一點點總結,如果有什麼決定不對的話,歡迎指正!
KMP演算法 快速求解next陣列
在kmp演算法中,最關鍵的就是求解next陣列了。那麼如何快速求解next陣列呢?已知模式串 ab cdabdd a 其next陣列 00 0 0 12 0 0 1 那麼是如何求證出來的呢?首先字串從左至右遍歷。第乙個字元a的next陣列對應元素為0,第乙個字元a和第2個字元b比,不相等。b 0 表...
KMP演算法 next陣列的求解
void getnext vector int next,string s if s i s j next i j 為什麼j按照上述的更新方法,是s 0 i 這個字串中字首和字尾相等的最大字串的長度 j的更新方式 如果s i s j j一直回退 j next j 1 直到回退到s j s i 如果s...
KMP演算法中的next陣列求解
kmp演算法是在模式串的next陣列基礎上進行的,如何求解next陣列就成了關鍵。next陣列的求解和主串無關,只與模式串自身相關。則next j 1,當j 0時 max k 00,其他情況 比如對於p 5 c,next 5 2,因為 p0p1 p3p4 此時k 2。下面參考 資料結構 嚴蔚敏書中的...