java sunday

引用大佬的解释(目录为:扩展2,文中KMP讲解非常详细):https://blog.csdn.net/v_july_v/article/details/7041827
直接粘代码(只展示核心,边界值只做简单校验,鲁棒性没深究):

    private static int sunday (char[] base, char[] model){
        if (base.length == 0 || model.length == 0){
            return 0;
        }
        Map<Character, Integer> strMap = getStrMap(model);
        int i = 0, j = 0, count = 0, bl = base.length, ml = model.length;
        while (i + ml - j <= bl){
            if (base[i] == model[j] ){
                i++;
                j++;
                if (j == ml){
                    i = i - j + 1;
                    j = 0;
                    count++;
                }
            } else {
                if (i + ml - j >= bl){
                    break;
                } else {
                    int shift = strMap.get(base[i + ml -j]) == null ? ml + 1 : strMap.get(base[i + ml -j]);
                    i += shift - j;
                    j = 0;
                }
            }
        }
        return count;
    }

    private static Map<Character, Integer> getStrMap(char[] str){
        Map<Character, Integer> strMap = new HashMap<Character, Integer>();
        int sl = str.length;
        for (int i = 0;i < sl;i++){
            strMap.put(str[i],sl-i);
        }
        return strMap;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值