public static void main(String[] args) {
String s="bababb";
String patten="bab";
int[] next_s = next(s);
System.out.println(Arrays.toString(next_s));
System.out.println(kmpSearch(s,patten));
}
private static int kmpSearch(String s, String patten) {
int[] next_p = next(patten);
//源串指针
int i=0;
//模式串指针
int j=0;
while (i<s.length()){
//匹配上了
if(j<0||s.charAt(i)== patten.charAt(j)){
j++;
i++;
}else {
j=next_p[j];
}
if(j==patten.length()){
return i-j;
}
}
return -1;
}
private static int[] next(String s) {
int[] next=new int[s.length()];
next[0]=-1;
if(s.length()==1){
return next;
}
next[1]=0;
int j=1;
int k=next[j];
//next数组 每次都排除子串的最后一位
while (j<s.length()-1){
if(k<0||s.charAt(j)==s.charAt(k)){
next[++j]=++k;
}else {
k=next[k];
}
}
return next;
}
kmp_search的java实现
最新推荐文章于 2024-09-25 10:59:43 发布