characterReplacement-替换后的的最长重复字符

题目说明

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

注意:字符串长度 和 k 不会超过 104。

示例 1:

输入:s = “ABAB”, k = 2
输出:4
解释:用两个’A’替换为两个’B’,反之亦然。

示例 2:

输入:s = “AABABBA”, k = 1
输出:4
解释:
将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。
子串 “BBBB” 有最长重复字母, 答案为 4。

Related Topics 双指针 Sliding Window

解题思路

之前做过类似的题目,求最长的重复字符串,使用的是双指针,右-左,在存放到一个保留字段max中,这里的max就是窗口的大小,只有更新max时候,窗口才会变大。
1.窗口的大小最小是k+1(一般情况)
2.窗口的定义是,窗口内最多的元素+k
3.窗口滑动,不满足窗口的更新则向右继续滑动,此时窗口整体平移
4.窗口更新,新增的元素是最多的哪个元素

代码演示

class Solution {
    public int characterReplacement(String s, int k) {
        //字符串的长度小于k,则返回的结果必定是s,因为都可以被替换
            if(s.length()<=k+1)
                return s.length();
            //0-A,25-Z 用来存放窗口内各个字母的数量
            int[] map=new int[26];
        char[] chars = s.toCharArray();
        int left=0,right;
        int max=0;
        for(right=0;right<s.length();right++)
        {
            //变量index存放字符的索引值
            int index=chars[right]-'A';
            //当前窗口内,该字母数量+1;
            map[index]++;
            //更新窗口内最多的字母数量
            max=Math.max(max,map[index]);
            //新增的数加入到窗口,不满足可以更新窗口的条件
            //窗口向左平移
            if(right-left+1>max+k)
            {
                //只要平移,窗内就会少一个元素,这个对应元素的数量不纳入窗内数量的统计,将数量-1;
                map[chars[left]-'A']--;
                left++;
            }

        }
         //窗户到达左右边的时候,此时的right为s.length();
        return right-left;
    }
}

运行效果

info
解答成功:
执行耗时:6 ms,击败了60.54% 的Java用户
内存消耗:38.8 MB,击败了8.85% 的Java用户

你可能感兴趣的:(算法,leetcode,java,指针,字符串)