public class KMP{
private int[][] dp;
private String pat;
public KMP(String pat){
this.pat = pat;
int M = pat.length();
dp = new int[M][256]; // dp[状态][遇到的字符] = 下个状态
dp[0][pat.charAt(0)] = 1; //base case
int X = 0; // 影子状态 X 初始为 0
for(int i=1;i<M;i++){ //当前状态是i
for(int j=0;j<256;j++){ //遍历所有可能出现的字符j
if(j==pat.charAt(i)) //如果遇到的字符j刚好等于pat中唯一能匹配的字符
dp[i][j] = i+1; //则状态向下推进
else
dp[i][j] = dp[X][j];//否则状态退回到影子状态
}
X = dp[X][pat.charAt(i)]; // 更新影子状态
}
}
public int search(String txt){
int M = pat.length();
int N = txt.length();
int j = 0; // pat 的初始态为 0
for(int i=0;i<N;i++){
j = dp[j][txt.charAt(i)]; // 计算 pat 的下一个状态
if(j==M)
return i-M+1;
}
return -1;
}
}
调用方法:
KMP kmp = new KMP(needle);
int pos1 = kmp.search("haystack1");
int pos2 = kmp.search("haystack2");
......