kmp算法

具體參考http://www.javashuo.com/article/p-hzrrjrai-hg.htmlhtml

/**
     * 建立next數組(數組第0位沒做用, 從第1位纔是有效位)
     * @param pattern
     * @return
     */
    static int[] makeNext(String pattern)
    {
        char[] chars = pattern.toCharArray();
        int[] next = new int[chars.length + 1];
        int i = 1;
        next[1] = 0;
        int j = 0;
        while (i < chars.length)
        {
            if (j == 0 || chars[i-1] == chars[j-1])
            {
                i++;
                j++;
                next[i] = j;
            }
            else
            {
                j = next[j];
            }
        }
        return next;
    }

    /**
     * kmp方法查詢字符串(快速模式匹配算法)
     * 源字符串中的索引i不會回溯, 比對字符串時
     * 找到不同的, 移動模式串的索引j來與源串中i位置再繼續比較
     * @param src
     * @param pattern
     * @return
     */
    public static int kmpFindStr(String src, String pattern) {
        int[] next = makeNext(pattern);
        char[] s = src.toCharArray();
        char[] t = pattern.toCharArray();
        //j爲模串的索
        int j = 0;
        //i爲源字符串的索引
        for(int i = 0; i < s.length;) {
            if(j == 0 || t[j] == s[i]) {
                i++;
                j++;
                if(j >= t.length) {
                    //找到了
                    return i - j;
                }
            }
            else {
                //兩個值不同, 修改j的跳轉位置
                j = next[j];
            }
        }
        return -1;
    }

    /**
     * 測試
     *
     * @param args
     */
    public static void main(String[] args) {
        int index = kmpFindStr("abf55abaabaca11", "abaabaca");
        System.out.print(index);
    }
相關文章
相關標籤/搜索