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