昨天又看了一天的kmp的部落格,結果是一直在套著模板做題,完全沒理解,簡單的模板題很容易a,但稍微考察思想的題就看不懂了,到了晚上偶然翻了翻藍書,感覺弄懂了點。
下面是分析過程:思路還是有點亂,也只能是自己看,,,再沉澱一下應該會理解的更好。
kmp:
解決的問題:字串的匹配問題;
分析:假設現在有兩個字串:母串ababbbabac,模板串abac;問題時查詢模板串在母串中出現的位置;
暴力解法:
1、將母串以及模板串的首端對齊;
2、模板串長度範圍內逐個對比母串與模板串的元素;
3、若完全一樣,匹配成功;否則,匹配失敗;
4、將模板串首端與母串第二位對齊,重複過程2、3,直至模板串首位與母串最後乙個元素對齊;
優化:容易發現,這種正常思考中的移動,其實就是去尋找模板串與母串已經匹配的部分(模板串的前多少位)的模板串的字首(這裡不含最後一位)與母串字尾(這裡不含字首)的最大匹配值,即將對應匹配值的字首與字尾對齊,例如這裡已經匹配的部分為aba,母串字尾ba與模板串字首ab最大匹配值為1,所以將模板串的a與母串的a對齊,即模板串的首位與母串的第三位對齊;
所以現在問題變為怎麼求匹配值,即求next陣列,不妨將模板串自身與自身比較,當產生一段匹配區間時,(例如串2的i~對應長度位置與串1的1~j已經一一對應,則next【串1當前的末位置】=j),所以next陣列就求出來了。 匹配過程中模板串的移動還和上段思路一樣。
用**實現的話就是
int next[11000];
void getnext()
}
同理,我們也可以得到模板串與母串匹配的**;
int kmp[11000];
void kmp()
}
針對問題的話:
目前看了的比如求模板串在母串中出現的位置,次數,這是最基礎的模板題;
變式的話比如求多個串的最長公共子串行,這時列舉第乙個串的子串,然後與其他串匹配即可,注意不要寫成暴力,kmp這裡沒理解好的話是會tle的,例如poj3450:
單鏈表(10月14日學習總結)
今日內容 1.單鏈表操作 1 插入 s next p next p next s 2 刪除 3 套路 tatus listdelete linklist l,int i,elemtype e if p next j 1 這些操作無非就是尋找 操作。4 以後存一堆數的時候,別只會用陣列了,用用鍊錶吧!...
10月14日站立會議
小組名稱 飛天小女警 專案名稱 禮物挑選小工具 小組成員 沈柏杉 組長 程媛媛 韓媛媛 譚力銘 ssh git git.coding.net shenbaishan gift.git 會議內容 一.已完成項 蒐集更多禮物素材,新增進禮物資料庫。韓媛媛 增添禮品 編寫 沈柏杉 產品展示一系列工作 譚力...
10月27日總結
pandas 提供了多種將 series dataframe 物件組合在一起的功能,用索引與關聯代數功能的多種設定邏輯可執行連線 join 與合併 merge 操作。詳見合併 opens new window concat opens new window 用於連線 pandas 物件 in 73 ...