publicclassKMP{privateint[][] dp;private String pat;publicKMP(String pat){this.pat = pat;int M = pat.length();// dp[状态][字符] = 下个状态
dp =newint[M][256];// base case
dp[0][pat.charAt(0)]=1;// 影子状态 X 初始为 0int 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)];}}publicintsearch(String txt){int M = pat.length();int N = txt.length();// pat 的初始态为 0int 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;}}