题目描述:424. 替换后的最长重复字符
首先理解滑动窗口是找到最大连续字符出现的次数
本题意思是可以替换k个字符组成连续的字符串,则判断目前滑动窗口宽度是否大于 出现次数最多的字母个数+k ,大于的话滑动窗口滑动,小于则窗口扩张。
我们维护一个数组int[26]来存储当前窗口中各个字母的出现次数,left表示窗口的左边界,right表示窗口右边界
窗口扩张:left不变,right++
窗口滑动:left++, right++
historyCharMax保存滑动窗口内相同字母出现次数的历史最大值,通过判断窗口宽度(right - left + 1)是否大于historyCharMax + K来决定窗口是否做滑动,否则窗口就扩张
class Solution {
public:
int characterReplacement(string s, int k) {
int count[26]={0};//建立字符->字符数量的映射
int left=0,right=0,result=0,maxCount=0;
while(right<s.size())
{
count[s[right]-'A']++;
maxCount=max(maxCount,count[s[right]-'A']);//当前窗口内的最多字符的个数
if(right-left+1-maxCount>k){//需要替换的字符个数就是当前窗口的大小减去窗口中数量最多的字符的数量
count[s[left]-'A']--;//缩小窗口
left++;
}
//当窗口内可替换的字符数小于等于k时,我们需要根据该窗口长度来确定是否更新result
result=max(result,right-left+1);
right++;
}
return result;
}
};
优化代码:
class Solution {
public:
int characterReplacement(string s, int k) {
int res = 0, maxCnt = 0, start = 0;
vector<int> counts(26, 0);
for (int i = 0; i < s.size(); ++i) {
maxCnt = max(maxCnt, ++counts[s[i] - 'A']);
while (i - start + 1 - maxCnt > k) {
--counts[s[start] - 'A'];//我在这里写错了,减少的是左边界字母的cnt,而不是当前字母的cnt
++start;
}
res = max(res, i - start + 1);
}
return res;
}
};