您的位置:首页 > 其它

KMP字符串匹配

2012-09-13 17:22 218 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: