KMP演算法(淺顯易懂)

2021-08-07 05:38:52 字數 976 閱讀 5167

kmp演算法求解什麼型別問題

字串匹配。給你兩個字串,尋找其中乙個字串是否包含另乙個字串,如果包含,返回包含的起始位置。

講道理

大串a(長度n) 小串b(長度m)

一般匹配字串,乙個乙個比,當前字元對了則比對下乙個,不對了再從b的頭開始比,移動乙個位置;這樣的時間複雜度是o(n*m)

kmp可以實現複雜度為o(m+n)

改進的點就在於通過當發生不匹配時,之前匹配完成的部分的資訊的利用:b串能往前走不止是1;

概念

最大相同前字尾

abcdab—–ab

ababa——-aba

構建乙個與b對應的next陣列,記錄在當前這個位置字元的前邊的字元構成的字串的最大相同前字尾的值;

上個圖,網上找的:

說白了就是構建乙個這個:

當ab不匹配,則直接讓3對過來。

理解這個圖,比看懂演算法更重要;

public

static

intnext(int rootint,int rootint_position)

if (rootint[position]==rootint[key])

next[position]=key;

}key = rootint_position - key;//這裡是直接返回了應該移動的距離

return key;

}

next表中用什麼值無所謂,因為你後期要用的時候可以稍加處理;

只要能將目標距離得到即可;

前期陷進了每次匹配都計算乙個next的誤區,後發現前期對b先進行處理(即next的計算)即可。

淺顯易懂的委託

一 我對委託的理解 委託是方法的容器,它不生產方法,它只是方法的搬運工。委託這個詞用到程式設計裡面對於很多新人來說可能都不太好理解,以前剛接觸委託的時候也看過不少文章,對於這個詞的解釋大多都雲裡霧裡。但把 委託 換成 託付 對於它的理解可能會清晰不少。例如,劉備將兒子委託給了趙雲和劉備將兒子託付給了...

淺顯易懂的桶排序

想準備將所有的排序演算法都總結出來,方便你查閱,也方便我複習和記憶,下面來說桶排序 首先必須申明,桶排序和計數排序完全不同,不可混為一談 這裡例項用單鏈表來操作 還是老方法,看文字就是煩,直接上圖,結合,永遠都是王道 1.假設 桶待排序列 看了之後有沒有特莫感覺就是雜湊桶,哈哈,滿足一定條件差不多就...

python中yield的用法 淺顯易懂

def consumer name print s 準備吃包子啦 name while true baozi yield return返回的值.print 包子 s 來了,被 s 吃了 baozi,name c consumer 小華 print 華麗分割線1 print c.next print ...