KMP算法(三):算法改進

KMP算法(一)見鏈接:https://blog.csdn.net/not_say/article/details/105291946

 

一、KMP算法存在的缺陷及改良:

這裏直接將《大話數據結構》裏面的說明截圖來用了,因爲有畫圖,說明的比較清楚:

public static int[] getNextVal(String son) {
        int i = 0, j = -1;
        int[] nextVal = new int[son.length()];
        nextVal[0] = -1;
        while (i < son.length() - 1) {
            if (j == -1 || son.charAt(i) == son.charAt(j)) {
                i++;
                j++;
                // 這裏是改良的地方
                if (son.charAt(i) != son.charAt(j)) {
                    // 若當前字符與前綴字符不同,則當前的 j 爲nextVal在 i 位置的值
                    nextVal[i] = j;
                } else {
                    //若當前字符與前綴字符相同,則將前綴字符的nextVal的值賦給nextVal在i位置的值
                    nextVal[i] = nextVal[j];
                }

            } else {
                j = nextVal[j];
            }
        }
        return nextVal;

    }

 

二、總結

改進過的KMP算法,它是在計算出next值的同時,如果a位字符與它next值指向的b位字符相等,則該a位的nextVal就指向b位的nextVal值,如果不等,則該a位的nextVal值就是它自己a位的next的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章