KMP算法JAVA实现

KMP为的是解决2字符串匹配问题的算法,检查一个字符串是否为另一个的子串,sub = "abc" , str = "aabcd" , str里包含了一个sub,KMP算法可以以O(M+N)的复杂度找到子串在str的位置。

可能理解问题,多少和网上找的不同

 1 //KMP中的核心算法,获得记录跳转状态的next数组
2      public static int[] next(String sub) {
                  int[] a = new int[sub.length()];
                 char[] c = sub.toCharArray();
                  int length=sub.length();
                  int i,j;
                  a[0] = -1;
                  i = 0;
                 for(j=1;j<length;j++) {
                     i = a[j - 1];
                     while(i>=0&&c[j]!=c[i+1]) {
                         i = a[i];
                     }
                    if(c[j]==c[i+1]) {
                        a[j] = i+1;
                    }
                    else {
                        a[j] = -1;
                    }
                 }
                 return a;
             }


另一个关键函数

        public static void pattern(String str,String sub,int[] next) {
            char[] ch1 = str.toCharArray();
            char[] ch2 = sub.toCharArray();
            int i = 0,j = 0;  //i控制ch1,j控制ch2;
            for(;i<ch1.length; ) {
                if(ch1[i]==ch2[j]) {//匹配就自动递增,往后匹配。
                    if(j==ch2.length-1) {
                        System.out.println(i-ch2.length+1);
                        break;
                    }
                    j++;
                    i++;
                }
                else if(j==0) {
                     i++;
                }
                else {
                    j = next[j-1]+1;
                }
            }
        }

应用

    public static void main(String[] args) {
String sub = "aabaccfaddddaabc";
String str = "gdsaadfdgffccsdaabaccfdaddaabaccfaddddaabcga";
int[] next = next(sub);
pattern(str,sub,next);

}
//结果:26---->41;




posted on 2011-10-16 23:35  Topless  阅读(7869)  评论(1编辑  收藏  举报

导航