解题思路
-
原本的解题思路,枚举最长字符串的第一个字符,然后不断向后寻找最长的字符串,思路错误,因为s里面的字符不一定是最长字符串的第一个字符。
-
正确的思路:滑动窗口
设置一个left指针,一个right指针:
left=right=0;
设置一个res=0,记录我们的结果。
设置maxCharNum维护窗口中也就是[left,right)区间内的出现最多的字符的个数,这样剩下的字符个数就是remain=right-left-maxCharNum,当remain<k的时候,所有的字符可以被替换,得到一个窗口的最大值,在这个窗口满足这个条件的过程中,不断的取res=max(res,right-left)的最大值,这就是我们最终的答案。
maxCharNum的维护只需要在right向右移动的时候维护。
什么时候right++?
- remain=right-left-maxCharNum,当remain<=k的时候,right++
什么时候left++?
当满足remain=right-left-maxCharNum,当remain>k的时候,remain++。
int left=0,right=0; int res=0; int chars[26]={0}; int maxCharNum=0; while(right<n){ int index=(int)(s[right]-'A'); chars[index]++; maxCharNum=max(maxCharNum,chars[index]); right++; if(maxCharNum+k<right-left){ index=(int)(s[left]-'A'); chars[index]--; left++; } res=max(res,right-left); } return res;
代码
class Solution {
public:
int n,k;
int characterReplacement(string s, int k) {
n=s.size();
this->k=k;
if(n<=1){
return n;
}
// int left=0,right=1;
// int res=0,remain=k;
// char curChar=s[0];
// while(right<n){
// remain=k;
// curChar=s[left];
// right=left+1;
// // cout<<"remain: "<<remain<<" "<<curChar<<endl;
// while(remain>0&&right<n){
// if(s[right]!=curChar){
// remain--;
// }
// right++;
// // cout<<"here1: "<<right<<" "<<remain<<" "<<s[right]<<endl;
// }
// while(right<n&&s[right]==curChar){
// right++;
// // cout<<"here2: "<<s[right]<<endl;
// }
// // cout<<left<<" "<<right<<" "<<right-left<<endl;
// res=max(res,right-left);
// while(left<right&&s[left]==curChar){
// left++;
// }
// }
// reverse(s.begin(),s.end());
// left=0,right=1;
// remain=k;
// curChar=s[0];
// while(right<n){
// remain=k;
// curChar=s[left];
// right=left+1;
// // cout<<"remain: "<<remain<<" "<<curChar<<endl;
// while(remain>0&&right<n){
// if(s[right]!=curChar){
// remain--;
// }
// right++;
// // cout<<"here1: "<<right<<" "<<remain<<" "<<s[right]<<endl;
// }
// while(right<n&&s[right]==curChar){
// right++;
// // cout<<"here2: "<<s[right]<<endl;
// }
// // cout<<left<<" "<<right<<" "<<right-left<<endl;
// res=max(res,right-left);
// while(left<right&&s[left]==curChar){
// left++;
// }
// }
int left=0,right=0;
int res=0;
int chars[26]={0};
int maxCharNum=0;
while(right<n){
int index=(int)(s[right]-'A');
chars[index]++;
maxCharNum=max(maxCharNum,chars[index]);
right++;
if(maxCharNum+k<right-left){
index=(int)(s[left]-'A');
chars[index]--;
left++;
}
res=max(res,right-left);
}
return res;
}
};
```