每日1题-5

//很多从两头取拿的问题一般都可以用到滑动窗口的思想
//由于滑动窗口是连续的 所以我们可以把取走的字符放在窗口外面 也就是说在窗口里面的字符是我们不取的
//所以最开始我们应该取走所有的字符 也就是滑动窗口大小为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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值