# 字符串匹配算法-动态规划之 KMP 算法详解

### 字符串匹配算法-动态规划之 KMP 算法详解

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

KMP kmp = new KMP("aaab");
int pos1 = kmp.search("aaacaaab"); //4
int pos2 = kmp.search("aaaaaaab"); //4


09-21 1019
10-26 6362

05-24 1049
04-08 64
04-11 65
03-02 373
09-24 24万+
06-25 1万+
10-23 2万+
07-17 2612
08-14 7128
01-30 7565
03-15 549
10-15 467
08-16 6万+
11-14 1万+
10-27 6846
09-17 6491
04-13 5189