题目链接:https://leetcode-cn.com/problems/longest-repeating-character-replacement/
题目描述
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过
1
0
4
10^4
104。
示例 1:
输入:
s = "ABAB", k = 2
输出:
4
解释:
用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:
s = "AABABBA", k = 1
输出:
4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。
思路
// 滑动窗口
// 时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public:
int characterReplacement(string s, int k) {
unordered_map<char, int> m;
int l = 0, r = 0, ret = 0;
int maxCount = 0; // 出现次数最多的字符的出现次数
while(r < s.size()){
m[s[r]] ++;
maxCount = max(maxCount, m[s[r]]);
while(r - l +1 - maxCount > k) { // 如果当前窗口长度-出现最多字符的次数>K,即不满足条件时
m[s[l++]]--; // 窗口向右缩小
// 其实并不需要关心maxCount是否是被剔除的s[l],因为这个循环内实际只会执行1次
}
ret = max(ret, r - l +1);
r++;
}
return ret;
}
};