//完整KMP算法 public class KMP2 { public static void main(String[] args) { KMP2 obj = new KMP2(); String str1 = "askanfasdnabcdassabefafdfsd"; String str2 = "abcdassabe"; //1.求解next数组 int[] next = new int[str2.length()]; obj.getNext(str2.toCharArray(), next); //2.模式匹配成功返回索引 失败-1 int index = obj.getKMP(str1.toCharArray(),str2.toCharArray(),next); System.out.println(index); } //方法2 kmp匹配,类似bf算法 private int getKMP(char[] str1, char[] str2, int[] next) { int m = 0; //指向str1 int n = 0; //指向str2 while (m<str1.length && n<str2.length){ if (n==-1 || str1[m]==str2[n]){//前进:与next数组计算类似,2个动力 m++; n++; }else {//回滚 n=next[n]; } } if (n==str2.length){ return m-n; }else { return -1; } } //方法1:求解next数组 private void getNext(char[] str2, int[] next) { int j = -1;//前缀 int i = 0;//后缀 next[0] = -1; while (i <= str2.length - 2) { if (j == -1 || str2[i] == str2[j]) {//前进 i++; j++; next[i] = j; } else { //回滚 j = next[j]; } } } }
KMP之完整版-java
最新推荐文章于 2024-08-16 10:27:08 发布