KMP字符串匹配
2012-09-13 17:22 jiutianhe 阅读(130) 评论(0) 收藏 举报java版本:
package util;
public class KMPStringMatch {
//KMP字符串匹配
private int[] getNext(String T){//T为模式串
int[] next=new int[T.length()];
int j=1;//
int k=0;//
next[0]=-1;
next[1]=0;
while (j<T.length()-1) {
if (T.charAt(j)==T.charAt(k)) {
next[j+1]=k+1;
j++;
k++;
} else if (k==0) {
next[j+1]=0;
j++;
} else {
k=next[k];
}
}
return next;
}
@SuppressWarnings("unused")
private int[] getNextVal(String T){
int[] nextval=new int[T.length()];
int j=0;//
int k=-1;//
nextval[0]=-1;
while (j<T.length()-1) {
if (k==-1 || T.charAt(j)==T.charAt(k)) {
j++;
k++;
if (T.charAt(j)!=T.charAt(k)) {
nextval[j]=k;
} else {
nextval[j]=nextval[k];
}
} else {
k=nextval[k];
}
}
return nextval;
}
public int indexKMP(String S,String T,int start){
//模式串T与主串S匹配
int[] next=getNext(T);
int i=start;//主串指针
int j=0;//模式串指针
while (i<S.length()&&j<T.length()) {
if (j==-1||S.charAt(i)==T.charAt(j)) {
i++;j++;
} else {
j=next[j];
}
}
if (j<T.length()) {
return -1;//匹配失败
}else {
return (i-T.length());//匹配成功
}
}
//测试
public static void main(String[] args) {
KMPStringMatch ksm=new KMPStringMatch();
int result=ksm.indexKMP("ababcabcacbab", "abcac", 0);
System.out.println(result);
}
}
浙公网安备 33010602011771号