KMP_動態規劃演算法
阿新 • • 發佈:2022-05-29
這次的演算法算是從頭到尾給位漲知識,沒想到狀態機和演算法結合出來能出來KMP演算法,這裡我就不獻醜了,搜尋KMP百度第一個知乎那個寫的使真的好,我也是看他的才學習到的
KMP 演算法詳解 - 知乎 (zhihu.com)。這個使它演算法的連結
細節的部分大佬已經說過了,我就說一下簡略的步驟和相應的方法把,如果科班出身的應該看的懂
這個演算法的核心是一個確定有限自動機,可以這麼說,如果你的確定有限自動機寫出來了,那麼這個演算法已經完成百分之80了。
整體思路
寫出一個二維陣列,這個二維資料代表的是確定有限自動機,其中的橫座標代表相應的判斷的字串,縱座標代表所有字元(256個-阿斯克碼),其中的寫出的步驟包括,如果和下一個字元相等則狀態加一,如果不相等,則返回到之前的狀態,因為之前的狀態是完成的,所以這個演算法是動態規劃演算法。最後根據給出的字元來進行判斷。
程式碼實現
public class KMP { private int[][] dp; private String pat; public KMP(String pat) { this.pat = pat; int M = pat.length(); // dp[狀態][字元] = 下個狀態 dp = new int[M][256]; // base case dp[0][pat.charAt(0)] = 1; // 影子狀態 X 初始為 0 int X = 0;// 構建狀態轉移圖(稍改的更緊湊了) for (int j = 1; j < M; j++) { for (int c = 0; c < 256; c++) dp[j][c] = dp[X][c]; dp[j][pat.charAt(j)] = j + 1; // 更新影子狀態 X = dp[X][pat.charAt(j)]; } } public int search(String txt) {int M = pat.length(); int N = txt.length(); // pat 的初始態為 0 int j = 0; for (int i = 0; i < N; i++) { // 計算 pat 的下一個狀態 j = dp[j][txt.charAt(i)]; // 到達終止態,返回結果 if (j == M) return i - M + 1; } // 沒到達終止態,匹配失敗 return -1; } }