具体思想:
我人傻了,一个简单的滑动窗口,硬是整成了前缀和+滑动窗口,纯纯脱了裤子放屁;
分类两个序列,直接统计左右两区间的满足改动要求的最大区间即可;
具体代码:
1.前缀和+滑动窗口:
class Solution {
public:
int findscoope(vector<int>& vec,int k){
int l=0;
int r=1;
int maxn=0;
while(r<vec.size()){
if(vec[r]-vec[l]<=k){
while(r<vec.size()&&vec[r]-vec[l]<=k){
r++;
}
maxn=max(r-l-1,maxn);
}else{
l++;
}
}
return maxn;
}
int maxConsecutiveAnswers(string answerKey, int k) {
int n=answerKey.size();
vector<int>findone(n+1,0);
vector<int>findzero(n+1,0);
int index=1;
for(auto ch:answerKey){
if(ch=='T'){
findzero[index]=findzero[index-1];
findone[index]=findone[index-1]+1;
}else{
findzero[index]=findzero[index-1]+1;
findone[index]=findone[index-1];
}
index++;
}
return max(findscoope(findzero, k),findscoope(findone, k));
}
};
2.滑动窗口:
class Solution {
public:
int findscoope(string& vec,int k,char ch){
int l=0;
int r=0;
int maxn=0;
int cnt=0;
while(r<vec.size()){
if(vec[r]==ch)
cnt++;
while(cnt>k){
if(vec[l]==ch)
cnt--;
l++;
}
maxn=max(maxn,r-l+1);
r++;
}
return maxn;
}
int maxConsecutiveAnswers(string answerKey, int k) {
return max(findscoope(answerKey,k,'T'),findscoope(answerKey,k,'F'));
}
};