僅記錄下代碼,可求出所有匹配字符串的首字符下標
public class Main3 {
public static void main(String[] args) {
char[] s = new String("AABAACAADAABAABA").toCharArray();
char[] t = new String("AABA").toCharArray();
int[] next = getNext(t);
KMP(s,t,next,0);
}
//求next數組
private static int[] getNext(char[] t){
int[] next = new int[t.length+1];
int i=0,j=-1;
next[0] = -1;
while(i<t.length){
if(j==-1||t[i]==t[j]){
i++;j++;
next[i] = j;
}else{
j = next[j];
}
}
return next;
}
//KMP算法
private static void KMP(char[] s,char[] t,int[] next,int pos){
int i=pos;
int j=0;
while(i<s.length&&j<t.length){
if(j==-1||s[i]==t[j]){
i++;j++;
}else{
j = next[j];
}
}
if(j>=t.length){
System.out.print((i-t.length)+" ");
KMP(s,t,next,i-t.length+1);
}else{
return ;
}
}
}