import java.util.Arrays;
/**
* @author Drug
* @create 2020-05-13 16:51
*/
public class KMP {
public static void main(String[] args) {
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";
//String str2 = "BBC";
int[] next = kmpNext("ABCDABD");
System.out.println("next=" + Arrays.toString(next));
int index = kmpSearch(str1, str2, next);
System.out.println("index=" + index);
}
/**
* kmp匹配算法
* @param str1
* @param str2
* @param next
* @return
*/
public static int kmpSearch(String str1,String str2,int[] next){
//i是str1下标,j是str2下标
for(int i=0,j=0;i<str1.length();i++){
//如果i下标与j下标字符不同,j按照next数组回溯
while(j>0 && str1.charAt(i) != str2.charAt(j)){
j = next[j-1];
}
//如果i下标与j下标字符相同,j++
if(str1.charAt(i) == str2.charAt(j)){
j++;
}
//当j与str2长度相同时,即找到了
if(j == str2.length()){
//返回str1找到时的下标
return i-j+1;
}
}
//没有找到
return -1;
}
/**
* KMP算法Next数组的产生
* @param src
* @return
*/
public static int[] kmpNext(String src){
//next数组
int[] next = new int[src.length()];
//0下标永远为0,即第一位不一样直接移位1格
next[0] = 0;
//i是后缀下标,j是前缀下标
for(int i=1,j=0;i<src.length();i++){
//前缀下标大于0,并且前缀下标i与后缀下表j字符不一样
while(j>0 && src.charAt(i)!=src.charAt(j)){
//前移动到i下标与j下标一样
j = next[j-1];
}
//如果前缀下标i等于后缀下标j,后缀下表移位一格
if(src.charAt(i) == src.charAt(j)){
j++;
}
//next数组定义
next[i] = j;
}
return next;
}
}
java字符串匹配KMP算法代码实现
最新推荐文章于 2022-07-20 11:31:19 发布