一、题目
给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。
在执行上述操作后,返回包含相同字母的最长子字符串的长度。
示例 1:
输入:s = "ABAB", k = 2
输出:4
解释:用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:s = "AABABBA", k = 1
输出:4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。
提示:
1 <= s.length <= 105
s 仅由大写英文字母组成
0 <= k <= s.length
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-repeating-character-replacement
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
使用变长的滑动窗口,先了解一下什么是滑动窗口。
滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。
分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。
这题的活动窗口初始长度为0,最大长度是相同的字符串+k,在不断遍历的过程中,需要用maxn去记录最大字符串,才能约束left左移。
三、代码
class Solution {
public int characterReplacement(String s, int k) {
int[] count = new int[26];
int left = 0, right = 0;
int maxn = 0;
while(right < s.length()) {//滑动窗口切忌回溯,left和right都只能往右移动
int index = s.charAt(right) - 'A';
count[index]++;
maxn = Math.max(count[index], maxn);
if(right - left + 1 - maxn > k) {//说明k次替换已经用完了,left需要左移
count[s.charAt(left) - 'A']--;
left++;
}
right++;
}
return right - left;
}
}