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;
    }
}

 

posted @ 2022-05-29 15:43  七色angel  阅读(100)  评论(0编辑  收藏  举报