KMP算法(三):算法改进

KMP算法(一)见链接:https://blog.youkuaiyun.com/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的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值