KMP 算法实现

来源:互联网 发布:邮箱的域名是什么 编辑:程序博客网 时间:2024/06/07 15:56

    

    KMP算法: 字符串快速匹配算法,已知目标串 T 和 子串f, 依次比较 T 和 f 的每一位, 当匹配到第I 位发现不匹配时,需要移动子串继续比较,传统是每次移动一位,KMP算

法是求出已匹配子串的前缀和后缀的公共字串长度K, 每次移动K位从 T 的 i - k -1位开始匹配。

    

   优点:KMP克服了每次比较失败只移动一位的复杂度,从 o(m*n)  减到 o(m+n)。

   缺点 : 需要预处理子串 f ,求出 next 数组

    例: T : 1231278   此时 i = 7

              f:  1231245  

    当匹配到 T 的字符 7 时,匹配失败,由于此时 f 串12312有公共字串12,T 串不用从2开始匹配符,从3 开始比较即可。

     能减少比较次数,需要对子串f求公共子串的长度

     

   求子串的公共子串长度的方法,放到 next  数组里。

  public  int[] getNext(String b) {        int len = b.length();        int[] next = new int[len + 1];        next[0] = next[1] = 0;        int j = 0;        //i表示字符串的下标,从0开始        for (int i = 1; i < len; i++) {            //j在每次循环开始都表示next[i]的值,同时也表示需要比较的下一个位置            while (j > 0 && (b.charAt(i) != b.charAt(j))) j = next[j];            if (b.charAt(i) == b.charAt(j)) j++;            next[i + 1] = j;        }        return next;    }




    



    

0 0