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;
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务