主串 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 表...