给你一个字符串 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^55
s 仅由大写英文字母组成
0 <= k <= s.length
滑动窗口,窗口内除数量最多的字符外,其他字符加起来不能超过k,找出最长的该窗口即可:
cpp
class Solution {
public:
int characterReplacement(string s, int k) {
int left = 0;
map<char, int> cnt;
multiset<int> cntNum;
int ans = 0;
for (int i = 0; i < s.size(); ++i) {
auto it = cntNum.find(cnt[s[i]]);
if (it != cntNum.end()) {
cntNum.erase(it);
}
++cnt[s[i]];
cntNum.insert(cnt[s[i]]);
while (i - left + 1 - *cntNum.rbegin() > k) {
auto it = cntNum.find(cnt[s[left]]);
if (it != cntNum.end()) {
cntNum.erase(it);
}
--cnt[s[left]];
cntNum.insert(cnt[s[left]]);
++left;
}
ans = max(ans, i - left + 1);
}
return ans;
}
};
如果字符串s的长度为n,s中的字符种类为m,则此算法时间复杂度为O(n),空间复杂度为O(m),cntNum里最多有cnt.size()个元素。