leetcode第九天之替换后的最长重复字串424

在这里插入图片描述
在这里插入图片描述

滑动窗口

public static int characterReplacement(String s, int k) {
        //规定特殊情况
        if (s == null) {
            return 0;
        }
        char[] cs = s.toCharArray();

        //设定一个26长度的数组,给窗口内出现的字母计数
        int[] map = new int[26];
        //左窗口、右窗口、搜索窗口长度
        int left = 0;
        int right = 0;
        int maxlen = 0;
        //限定在s字符串内
        while(right<s.length()){
            //给出现的编号并且计数
            int index = cs[right] - 'A';
            map[index]++;
            //每一次都去更新当前最大窗口长度
            maxlen = Math.max(maxlen, map[index]);
            //当前窗口 与 替换K次最大长度比较
            //小于:证明当前窗口替换完,窗口内都是重复字母
            //大于:证明当前窗口替换完,存在不是重复字母的情况
            if (right - left + 1 > maxlen + k) {
                //左窗口的字母即将移除,计数-1
                map[cs[left] - 'A']--;
                //左窗口右移
                left++;
            }
            //右窗口左移
            right++;
        }
        //计算当前最大窗口
        return cs.length - left;
    }

在这里插入图片描述

学以致用

  • char-char返回int
    ‘B’-‘A’=1

限定在字符串内时(步骤总结)

  • 1、从第一个字母开始,给字母编号并且计数
  • 2、每次跟新窗口内最多重复字母个数maxlen
    max(窗口内最大,当前字母在窗口内出现次数)
  • 3、窗口长度 与 maxlen+可替换次数k次
    大于:证明替换后仍然不全是重复字母,需要更新窗口长度(执行第四步)
    小于:替换完当前窗口全是重复字母(执行第五步)
  • 4、左窗口的字母对应编号–
    左窗口右移
  • 5、右窗口右移
  • 继续第一步
  • s字符串走到尽头时:返回字符串长度-左窗口位置
    总结:
    假如窗口长度变为5,那么之后的窗口只会扩大,不会缩小 ,最大窗口由maxlen+k决定
    所以最后才会返回字符串长度-左窗口位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值