//很多从两头取拿的问题一般都可以用到滑动窗口的思想
//由于滑动窗口是连续的 所以我们可以把取走的字符放在窗口外面 也就是说在窗口里面的字符是我们不取的
//所以最开始我们应该取走所有的字符 也就是滑动窗口大小为0
//然后用滑动窗口的思路 先扩大右边界 进入窗口的字符就等价于我们放回去了 对应的cnt数组的位置减1
//如果我们放回去之后 发现我们取走的字符数不够K个 我们就需要把滑动窗口的左边界向后移动也就是取走左边的数
//mx不断更新滑动窗口的大小 本题滑动窗口越大 最后答案越小
class Solution {
public:
int takeCharacters(string s, int k) {
int cnt[3]{};
for(char c:s){
cnt[c-'a']++;
}
if (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
return -1;
}
int mx=0,left=0;
for(int right=0;right<s.length();right++){
int c=s[right]-'a';
cnt[c]--;
while(cnt[c]<k){
cnt[s[left]-'a']++;
left++;
}
mx = max(mx,right-left+1);
}
return s.length()-mx;
}
};