题目描述

滑动窗口问题
可以转化为求按照题目要求从两端取走字符后,中间部分的最大长度。中间部分就是一个滑动窗口。
cpp
class Solution {
public:
int takeCharacters(string s, int k) {
vector<int> count(3,0);
int n = s.size();
for(int i = 0;i <n;i++){
count[s[i] - 'a']++;
}
if(count[0] < k || count[1] < k || count[2] < k)
return -1;
int a_threshold = count[0] - k;
int b_threshold = count[1] - k;
int c_threshold = count[2] - k;
int right = 0;
int max_len = 0;
int a_count = 0;
int b_count = 0;
int c_count = 0;
for(int left = 0;left < n;left++){
while(a_count <= a_threshold && b_count<= b_threshold && c_count<= c_threshold){
max_len = max(max_len,right -left);//[left,right)
if(right == n)
break;
if(s[right] == 'a') a_count++;
if(s[right] == 'b') b_count++;
if(s[right] == 'c') c_count++;
right++;
}
if(s[left] == 'a') a_count--;
if(s[left] == 'b') b_count--;
if(s[left] == 'c') c_count--;
}
return n - max_len;
}
};