KMP字符串匹配
2012-09-13 17:22 jiutianhe 阅读(126) 评论(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); } }