- KMP模式匹配
- 计算next值:下标从0开始,当j=x,取0-(j-1)的字符,判断前缀和后缀字符是否相等,相等的字符个数
- 字符的前缀是值不包含最后一个字符在内的所有,
- 前缀和后缀最大长度为k 的相同前缀后缀
- 如:t=“aaaaa aab” 当j=4 t4=aaaa 前缀aaa 后缀aaa next=3
public void getNext(String t,int next[]){
int i;
i=1;
next[0]=0;
while (i <= t.length()-1){
String subt=t.substring(0,i+1);
next[i]=calcMatchValue(subt);
++i;
}
}
private int calcMatchValue(String subStr) {
int length = subStr.length();
String preFixStr = subStr.substring(0, length-1);
String suffFixStr = subStr.substring(1);
while (preFixStr.length() > 0 && suffFixStr.length() > 0) {
if (preFixStr.equals(suffFixStr)) {
return preFixStr.length();
}
if (preFixStr.length() == 1 && suffFixStr.length() == 1) {
break;
}
preFixStr = preFixStr.substring(0, preFixStr.length() - 1);
suffFixStr = suffFixStr.substring(1);
}
return 0;
}
int indexKMP(String s,String t,int pos){
int i=pos;
int j=0;
int[] next=new int[t.length()];
getNext(t,next);
while (i <= s.length()-1 && j <= t.length()-1){
if(j==0 || s.charAt(i)==t.charAt(j)){
i++;
j++;
}else {
j=next[j];
}
}
if(j== t.length()){
return i-t.length();
}else{
return 0;
}
}