1. 依舊套用滑動窗口模板.
2. 窗口的大小與新單個字符的最大計數個數的差值即爲可以替換的字符個數.
3. 我們只需要關心新字符的到來會不會超過當前窗口的最大計數的個數.
4. 最難理解的部分是爲何不需要更新maxCount, 滑動平均需要找到第一個不滿足條件的字符串,且要是最長的,因此不更新不影響結果.
5. 最長的字符串一定在maxCount最大的時候取到, 否則一定有更長的字符串.
class Solution {
public:
int characterReplacement(string s, int k) {
if(s.length()==0) return 0;
int left=0, right=0;
map<char, int> window;
int maxCount = 0;
int res = INT_MIN;
while(right<s.length()) {
window[s[right]]++;
maxCount = max(maxCount,window[s[right]]);
//如果可以替換的字符的個數不超過k,
//則計入最終答案.
if(right-left+1-maxCount<=k) res = max(res, right-left+1);
right++;
//如果超過了,則需要縮小窗口.
if(right-left-maxCount>k) {
window[s[left]]--;
//這裏不需要更新maxCount的原因是maxCount有可能偏大,
//但是不會影響結果,因爲我們做滑動平均找到的是第一個
//不滿足條件的字符串,所以只需要將窗口整體向右移動就可以了,
//這個字符串不可能比之前記錄的要長.
left++;
}
}
return res;
}
};