1. 程式人生 > 其它 >KMP_動態規劃演算法

KMP_動態規劃演算法

這次的演算法算是從頭到尾給位漲知識,沒想到狀態機和演算法結合出來能出來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; } }