题目:
题解:
- 滑动窗口
这个问题的难点在于如何思考替换后的最长重复字符,我们需要建立一个窗口用来保存s中的子字符串,然后用一个字符表用来保存<字符,该字符数量>
,当出现该字符数量最大时,我们用当前窗口的大小减去最大字符数量就是可以被替换的字符个数了,然后与k进行比较,来进行窗口的放缩。
- 字符表来表示窗口,窗口的大小与最多字符个数之间的差值表示可以替换的字符个数,当可以替换的字符个数大于k时,我们需要缩小窗口,也就是left右移,直到可以替换的字符个数等于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']);//获得窗口中数量最多的字符数量
while(right-left+1-maxCount>k){//需要替换的字符就是当前窗口的大小减去窗口中数量最多的字符的数量
count[s[left]-'A']--;//缩小窗口
left++;
}
//当窗口内可替换的字符数小于等于k时,我们需要根据该窗口长度来确定是否更新result
result=max(result,right-left+1);
right++;
}
return result;
}
};