看這個需要你對kmp有點了解,我只講怎麼畫這個daf圖,其它基礎知識你們再去看資料了。
我就直接先把演算法第四章的圖搬上來了,然後開始一步步說怎麼畫
第一步:
因為a匹配所以若果是a就可以到狀態1,b,c就還是狀態0。那麼結果就是1 0 0;
第二步:
因為就兩個字母a和b,中間沒有了,所以就複製j=0時的狀態為 1 0 0,然後又因為b是匹配的可以進入到下乙個狀態,所以就把b的那乙個更新為2,結果就是 1 2 0
第三步:
因為有三個字母了,就把第1個字母b和第0個字母匹配,因為第0個字母是a,匹配失敗,所以還是把j=0的狀態複製過來得到 1 0 0, 然後又因為a是匹配的可以進入到下乙個狀態,所以就把a的那乙個更新為3,結果就是 3 0 0
第四步:
現在就是有四個字母了,就把中間的b,a和第0個字母進行比較,先用b和第0個字母比較,因為第0個字母是a,所以失敗。再用a和第0個字母比較,顯然比較成功,那麼就進入狀態1,因為狀態是從0開始的,現在就把j=1的值複製過來得到1 2 0,然後又因為b是匹配的可以進入到下乙個狀態,所以就把b的那乙個更新為4,結果就是 1 4 0
第五步:
現在有5個字母了,就把中間的b,a,b和第0個字母進行比較,先用b和第0個字母比較,因為第0個字母是a,所以失敗。再用a和第0個字母比較,顯然比較成功。繼續用b和第1個字母比較,因為第1個字母是b,比較成功,所以就把j=2的狀態複製過來得到3 0 0,然後又因為a是匹配的可以進入到下乙個狀態,所以就把a的那乙個更新為5,結果就是 5 0 0
第六步:
現在有6個字母了,就把中間的b,a,b,a和第0個字母進行比較,先用b和第0個字母比較,因為第0個字母是a,所以失敗。再用a和第0個字母比較,顯然比較成功。繼續用b和第1個字母比較,因為第1個字母是b,比較成功。繼續用a和第2個字母比較,因為第2個字母是a,比較成功,所以就把j=3的狀態複製過來得到1 4 0,然後又因為c是匹配的可以進入到下乙個狀態,所以就把c的那乙個更新為6,結果就是 1 4 6
KMP演算法 DFA版本
為了更好地理解kmp演算法,我們先來看看樸素的暴力法是如何執行的。設待匹配的字串為ababababac,模式串為ababac,i為字串下標,j為模式串下標 首先取i 0,遍歷一遍j,直到出現不匹配 ababababac ababac 然後取i 1,遍歷一遍j,直到出現不匹配 ababababac a...
演算法之KMP
kmp演算法是一種字串匹配演算法,時間複雜度為 m n 個人對演算法學習還在初級階段。以前對字串匹配用暴力匹配演算法。暴力匹配演算法 兩個字串,模板串mo和文字串s。如果用暴力演算法,對於模板串mo,用i表示模板串匹配的位置。用j表示文字串匹配的位置。1,如果從一開始匹配的上,i和j同時增加。2,當...
kmp演算法 簡單易懂
kmp字串 給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸入整數n,表示字串p的長度。第二行輸入字串p。第三行輸入整數m,表示字串s的長度。第四行輸入字串s。...