public class KMP {
//定义next取值
public static int getnext(String t, String s, int[] next){
next[0] = -1;//第一位初始为-1
int i =0, j = -1;
while(i<s.length()-1){
if(j == -1){
i++;
j++;
next[i] = j;
}else{
i++;
for(int k = 1; k < i; k ++){
if(s.substring(0,k).equals(s.substring(i-k,i))){
int n = s.substring(0,k).length();//相同字段的长度为next值
next[i] = n;
}
}
}
}
return kmp(t,s,next);
}
public static int kmp(String t, String s, int[] next){
int i =0,j=0;
while(i < t.length() && j < s.length()){
if(j == -1 || t.charAt(i) == s.charAt(j)){
i++;
j++;
}else{
j = next[j];//子段从j位开始遍历
}
}
if(j == s.length()){
return i-s.length();
}else{
return -1;
}
}
public static void main(String[] args) {
String t = "abcababcaababcdasfsf";
String s = "abcaababc";
int[] next = new int[s.length()];
int n = getnext(t,s,next);
System.out.println(n);
}
}
KMP算法
最新推荐文章于 2021-05-27 11:38:34 发布