KMP算法 动态规划实现
public class KMP {
//pat是要匹配的字段
private String pat;
//dp[状态][字母对应的ASCII码] = 下一步的位置
private int[][] dp;
public KMP(String pat){
this.pat = pat;
//256是ASCII码个数
dp = new int[pat.length()][256];
//初始化状态
dp[0][pat.charAt(0)] = 1;
//X是影子状态
int X = 0;
for (int i = 1; i < pat.length(); i++) {
for (int j = 0; j < 256; j++) {
if (pat.charAt(i) == j)
//如果匹配,就下一步
dp[i][j] = i + 1;
else
//不匹配就返回记忆状态
//X落后一个状态
dp[i][j] = dp[X][j];
}
//更新影子状态
X = dp[X][pat.charAt(i)];
}
}
public int search(String txt){
int temp = 0;
for (int i = 0; i < txt.length(); i++) {
//计算下一个状态
temp = dp[temp][txt.charAt(i)];
//如果到达终止态返回下标
if (temp == pat.length())
return i - pat.length() + 1;
}
//没有到达终止态
return -1;
}
}