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的值。

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