KMP演算法的next陣列求解步驟

2021-09-11 10:45:24 字數 882 閱讀 2974

主串 s="aabbcbbabbcaccd"

模式串 t="bbabbcac"

(1)固定前兩個 next[0]=-1,next[1]=0 

(2)從模式串t[2]開始,這裡是'a',倒序往前面看,如這裡第二個『b』,這個『b』為它的長度為1的子串,看到第乙個字母為止。比較這些子串與第乙個字母開始的子串有沒有匹配的,如這裡的長度為1的子串與第乙個字母t[0]剛好匹配,即ok,有next[2]=1  (1就是這個匹配串的長度,是不是很簡單)。

(3)與(2)同理,來到t[3],這裡是'b',前面子串(注意是倒序)有'a','ba',可見沒有與從頭開始數的串相匹配的,故next[3]=0。

(4)依次下去得到初步的next陣列[-1,0,1,0,1,2,0,0]

更新next陣列很關鍵,具體原因大家可以看看其他講原理比較多的部落格。

具體做法:j為next陣列的下標,k為得到的next陣列值。

當t[j]=t[k]時,更新next陣列的值為-1。

for example:

next[0]=-1  ..省略

next[1]=0    //t[1]==t[0]?更新next[1]=-1:不做更改

next[2]=1    //t[2]==t[1]?更新next[2]=-1:不做更改

next[3]=0    //t[3]==t[0]?更新next[3]=-1

next[4]=1    //t[4]==t[1]?更新next[4]=-1

next[5]=2    //t[5]==t[2]?更新next[5]=-1:不做更改

next[6]=0    //不做更改

next[7]=0    //不做更改

所以最後得到的next陣列就是[-1,-1,1,-1,-1,2,0,0]大功告成啦!

KMP演算法Next陣列求解

相信對於kmp演算法本身大家都理解,最難理解的就是這個next陣列的求解了。這是 p 為模式串,下標從 0 開始 void getnext string p,int next else j next j 根據我的理解,i 和 j 可以看成是兩個指標,用來跟蹤當前匹配的位置。可以發現 i 是會不斷的往...

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陣列呢?已知模式串 ab cdabdd a 其next陣列 00 0 0 12 0 0 1 那麼是如何求證出來的呢?首先字串從左至右遍歷。第乙個字元a的next陣列對應元素為0,第乙個字元a和第2個字元b比,不相等。b 0 表...