LeetCode 424.替换后的最长重复字符
给你一个字符串 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,找出最长的该窗口即可:
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()个元素。