在kmp演算法中,最關鍵的就是求解next陣列了。那麼如何快速求解next陣列呢?
已知模式串:ab cdabdd a
其next陣列:00 0 0 12 0 0 1
那麼是如何求證出來的呢?
首先字串從左至右遍歷。
第乙個字元a的next陣列對應元素為0,
第乙個字元a和第2個字元b比,不相等。b:0(表示字元b的next陣列對應元素為0);
第乙個字元a和第3個字元c比,不相等。c:0
第乙個字元a和第4個字元d比,不相等。d:0
第乙個字元a和第5個字元a比, 相等。a:1
第二個字元b和第6個字元b比, 相等。b:2(在前乙個字元的結果上累計)(相等之後,主動字元(此處將首先去和後面字元比較的字元稱為主動字元,後續字元稱為被動字 符),往後移一位,為b。被動字元依舊會往後移一位)
第三個字元c和第7個字元d比,不相等(此時就主動字元馬上又切換至首字元a)
第乙個字元a和第7個字元d比,不相等。d:0
第乙個字元a和第8個字元d比,不相等。d:0
第乙個字元a和第9個字元a比, 相等。a:1
依此類推。
別看講的這麼麻煩,大家在紙上推一遍就一目了然了。
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陣列就成了關鍵。next陣列的求解和主串無關,只與模式串自身相關。則next j 1,當j 0時 max k 00,其他情況 比如對於p 5 c,next 5 2,因為 p0p1 p3p4 此時k 2。下面參考 資料結構 嚴蔚敏書中的...