leetcode424——替换后的最长重复字符

题目描述

题目大概意思是:给一个仅由大写字母组成的字符串,最多可替换k次任意位置上的字符为其他字符,执行完这个操作,找出来包含重复字母的最长子串长度;

滑动窗口

暴力解法:

枚举该字符串里面的所有子串,如果所有字符都相同就考虑更长的子串,否则找出出现次数最多的,替换掉除出现次数最多的之外的字符;

暴力解法做了很多重复的工作,有很多重复子串重复扫描

滑动窗口解法:

首先使用左右指针进行移动,右指针移动,左指针从0开始

右指针遍历途中,每次都+1,将当前字符个数+1,并重新计算当前出现次数最多的子串长度

然后判断窗口的长度-出现次数最多的子串长度 > k,如果说明此时k不够用,不能填满这个窗口,那么缩短左窗口,左边界前移,此时注意频数数组要对应减

这个时候记录该窗口的大小

最终循环结束,返回记录的窗口大小

点击查看代码
public static int characterReplacement(String s, int k) {
    //首先找出频次最大的长度
    int[] ints = new int[26];
    int left = 0;
    int count = 0;
    int res = 0;
    int right = 0;
    while(right < s.length()) {
        ints[s.charAt(right) - 'A']++;
        count = Math.max(count, ints[s.charAt(right) - 'A']);

        if (right - left + 1 - count > k) {
            ints[s.charAt(left) - 'A']--;
            left++;
        }
        res = Math.max(res, right - left + 1);
        right++;
    }
    return res;
}
posted @ 2021-10-12 20:06  精神小土豆  阅读(39)  评论(0)    收藏  举报