一直以來學習都有點浮躁,抓著半截就跑,今天學習kmp演算法時,連示例**都沒有讀一遍就開始手擼**,根本沒有理解完整正文的意思。最後不僅求next寫錯了,kmp匹配也寫錯了,於是反反覆覆回去看教程,兩三個小時才寫出來。
kmp演算法,不管是主演算法還是預處理的next求取,在學習中要深刻把握住兩個不同的下標,思考何時應該往回退(術語回溯),何時應該+1,何時應該置零。
有主串s,模式串p。求:s有多少子串等於p?出現在s的什麼位置?
詳細描述見洛谷p3375 【模板】kmp字串匹配
本文略去暴力演算法的分析。
記p的前i位為子串t。
若存在u,使得u既是t的字首,也是t的字尾,則u最長的長度記錄於next[i]。
其實我感覺這裡命名為next怪怪的,但是我也沒有想到更貼切且簡潔的描述的方式,這樣看來,就按它的用途來命名也無可厚非。
匹配進行到主串的pos1位和模式串的第pos2位時,發現不匹配(在這之前的pos2-1位全部匹配)。在這時如果把pos2退回到第一位,就是暴力演算法;而退回到已經和s匹配了的後一項,則為kmp演算法。
如何回退呢?這裡就要用到的就是next陣列,它可以指引我們應該回退到第幾位。
圖** 洛谷網校 阮行止
值得注意的是,如果pos2已經退回到0了,那就無法繼續回退了,此時應該將pos1加1進行下一步的比較。
接下來描述如何求取next。
next陣列的思路和動規更加貼近,若已知前i-1位的next陣列,如何求取第i位的next呢?
記錄next[i-1]為tmp。
複習 KMP演算法
對於kmp演算法的學習,在寒假時我還是搞不太明白,但幾個月之後,對於它的理解又更近了一步。首先是對於子串的自我匹配,求乙個fail陣列,fail i 對於字串ss的前ii個字元構成的子串,既是它的字尾又是它的字首的字串中 包括他 最長的長度記作fail i 舉個例子,abcdabc中fail 7 的...
KMP匹配演算法複習。。
kmp演算法 knuth morris pratt algorithm knuth就是高德納。kmp演算法是從樸素匹配演算法改進而來 就是窮搜匹配。樸素匹配演算法 原串 abcde 模式串 acd 1.將原串和模式串左對齊,然後一位一位比較,直到有乙個字元不匹配 2.發現第二位的b和c不匹配,模式串...
藍橋複習 KMP
在s中尋找p 找到第一次出現的位置 void find next char p else k next k return intkmp char s,char p else j next j if j hp return i j else return 1 在next陣列裡,最後一位是不包括最後乙個...