https://leetcode.com/problems/longest-repeating-character-replacement/
Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the above operations.
Note:
Both the string's length and k will not exceed 104.Example 1:
Input:s = "ABAB", k = 2 Output:4 Explanation: Replace the two 'A's with two 'B's or vice versa.Example 2:
Input:s = "AABABBA", k = 1 Output:4 Explanation: Replace the one 'A' in the middle with 'B' and form "AABBBBA". The substring "BBBB" has the longest repeating letters, which is 4.
https://www.cnblogs.com/reboot329/p/5968393.html
滑动窗口:
class Solution {
public:
int characterReplacement(string s, int k) {
if(s.size() < k+2) return s.size();
int lo = 0;
int hi = k;
int result = k+1;
char maj = 'A';
vector<int> cnt(26, 0);
for(int i = lo; i <= hi; ++i){
++cnt[s[i]-'A'];
}
for(int i = 0; i < 26; ++i){
if(cnt[i] > cnt[maj-'A']) maj = 'A'+i;
}
++hi;
while(hi < s.size()){
++cnt[s[hi]-'A'];
if(cnt[s[hi]-'A'] > cnt[maj-'A']) maj = s[hi];
while(hi-lo+1-cnt[maj-'A'] > k){
--cnt[s[lo]-'A'];
if(s[lo] == maj){
for(int i = 0; i < 26; ++i){
if(cnt[i] > cnt[maj-'A']) maj = 'A'+i;
}
}
++lo;
}
result = max(result, hi-lo+1);
++hi;
}
return result;
}
};
滑动窗口的写法本身就很有技巧性,贴一个标准写法:
class Solution {
public:
int characterReplacement(string s, int k) {
int n = s.length();
if (n == 0) return 0;
int cnt[26] = {0};
int maxCount = 0, prev = 0;
for (int i = 0; i < n; i++) {
cnt[s[i]-'A']++;
maxCount = max(maxCount, cnt[s[i]-'A']);
if (maxCount+k < i-prev+1) {
cnt[s[prev]-'A']--;
prev++;
}
}
return n-prev;
}
};