思路:最长子字符串->滑动窗口
q1:怎么保证窗口内最多非最多字符ch的个数小于等于k?
a1:不用保证,换个思路:_max保存历史窗口内出现个数的最大值即可,当ch出现个数>k时,窗口整体右移一个位置(l++ r++),此时窗口内ch的个数可能大于k,但是对ans并不会产生贡献,除非后面遇到窗口内会出现某个字符个数大于_max,此时窗口长度+1,因此移动过程中窗口是一个变大的窗口。
2:当窗口内**_max + k < r - l + 1**时,表示ch出现个数>k,此时整体右移一个位置。
3:当k==0时,退化为s中最大连续子字符串。
4:r移动到n时,l到n-1是最大的滑动窗口长度。
class Solution {
public:
int characterReplacement(string s, int k) {
int flag[26] = {0};
int n = s.size(), l = 0, ans = 0, _max = 0;
for (int r = 0; r < n; ++r) {
flag[s[r] - 'A']++;
_max = max(_max, flag[s[r] - 'A']);
if (_max + k < r - l + 1) flag[s[l++] - 'A']--; //
}
return n - l;
}
};
代码:
1:s由大写字母构成,s来记录窗口内各个字符的个数,当添加s[r]后字符个数大于_max,则更新_ans。
2:if而不是while,因为 l最多移动一个位置



