获取next()数组
public static int[] getNext(String data){
int[] next=new int[data.length()] ;
next [0]=0;
int index=0;
for (int i = 1; i < next.length; i++) {
index =next[i-1];
if(data.charAt(index)==data.charAt(i)){
next[i]=index+1;
}
else{
next[i]=0;
}
}
return next;
}
匹配字符串
public static int find(String str,String data){
int[] next=getNext(data);
int i=0;
int j=0;
int count=0;
while(i++<str.length()){
if(count==data.length()){
return i+1-count;
}
if(str.charAt(i)==data.charAt(j)){
j++;
count++;
}else{
j=next[j];
count=j+1;
}
}
return -1;
}
测试案例
public static void main(String[] args) {
String res = Arrays.toString(getNext("abcdabd"));
System.out.println("next数组为:"+res);
int find = find("kajhdabcdabdasdaf","hda");
System.out.println("起始下标为:"+find);
}
输出结果
next数组为:[0, 0, 0, 0, 1, 2, 0]
起始下标为:3