package myString01;
public class KMPDemo {
public static void main(String[] args) {
String target=new String("aabcbabcaabcaababc"),pattern=new String("abcaababc");
System.out.println("KMP"+"("+target+","+pattern+")"+"="+KMP(target,pattern));
}
public static int KMP(String target,String pattern) {
return KMP(target,pattern,0);
}
public static int KMP(String target,String pattern,int begin) {
int n=target.length(),m=pattern.length();
if(begin<0)
begin=0;
if(n==0||n<m||begin>=n)
return -1;
int[]next = getNext(pattern);
int i=begin,j=0; //i,j分别为目标串,模式串比较字符下标
while(i<n&&j<m) {
if(j==-1||target.charAt(i)==pattern.charAt(j)) {//若当前两字符相等,则继续比较后续字符
System.out.println("target"+i+"="+"pattern"+j);
i++;
j++;
}else { //否则,下次匹配,目标串下标i不回溯
//System.out.println("target"+i+"="+"pattern"+next[j]);
j=next[j]; //模式串下标j退回到下次比较字符序号
if(n-i+1<m-j+1) //若目标串剩余子串的长度不够,不再比较
break;
}
}
if(j==m)
return i-j;
return -1;
}
private static int[] getNext(String pattern) { //返回模式串的的next数组
int j=0,k=-1,next[]=new int[pattern.length()];
next[0]=-1;
while(j<pattern.length()-1)
if(k==-1||pattern.charAt(j)==pattern.charAt(k)) {
j++;
k++;
if(pattern.charAt(j)!=pattern.charAt(k)) {
System.out.println("t"+j+"!="+"p"+k);
next[j]=k;
}else next[j]=next[k];
}
else k=next[k];
return next;
}
}