20240927训练日常

力扣每日一题

题面:

做法:如果考虑两边的区间,那么需要维护的就是时间(总区间长度)和选头还是选尾两个变量,这是一个a^{n}的dp,考虑维护中间那个区间的长度,两边区间越长越好,中间区间也就是越短越好,此时问题就变成了一个简单的滑动窗口:

在字符串s内选择一个区间,此时a,b,c的数量分别为x,y,z,需要让这个区间最长且a,b,c的数量均小于下x-k,y-k,z-k。

代码:

class Solution {
public:
    int takeCharacters(string s, int k) {
        map<int,int> cnt;
        cnt[0] = 0;
        cnt[1] = 0;
        cnt[2] = 0;
        for (char c : s) {
            cnt[c - 'a']++; 
        }
        if (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
            return -1; 
        }

        int mx = 0, l = 0;
        for (int r = 0; r < s.length(); r++) {
            char c = s[r] - 'a';
            cnt[c]--; 
            while (cnt[c] < k) { 
                cnt[s[l] - 'a']++;
                l++;
            }
            mx = max(mx, r - l + 1);
        }
        return s.length() - mx;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值