题目说明
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 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用户