力扣9.27

2516. 每种字符至少取 K 个

给你一个由字符 'a''b''c' 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。

你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1

数据范围

  • 1 <= s.length <= 105
  • s 仅由字母 'a''b''c' 组成
  • 0 <= k <= s.length

分析

本题有良好的二分性质,对于某一个 t t t,小于 t t t的分钟都无法满足,大于等于t的都可以满足,因此可以考虑二分答案

代码

c 复制代码
class Solution {
public:
    const static int N = 1e5 + 5;
    int prea[N], preb[N], prec[N];
    int lasta[N], lastb[N], lastc[N];
    int n;
    bool check(int t, int k) {
        for(int i = 0; i <= t; i ++ ) {
            int na = prea[i] + lasta[n - (t - i) + 1];
            int nb = preb[i] + lastb[n - (t - i) + 1];
            int nc = prec[i] + lastc[n - (t - i) + 1];
            if(na >= k && nb >= k && nc >= k) return true;
        }
        return false;
    }
    int find(int l, int r, int k) {
        while(l < r) {
            int mid = (l + r) >> 1;
            if(check(mid, k)) r = mid;
            else l = mid + 1;
        }
        return l;
    }
    int takeCharacters(string s, int k) {
        n = s.size();
        for(int i = 1; i <= n; i ++ ) {
            prea[i] = prea[i - 1] + (s[i  - 1] == 'a' ? 1 : 0);
            preb[i] = preb[i - 1] + (s[i  - 1] == 'b' ? 1 : 0);
            prec[i] = prec[i - 1] + (s[i  - 1] == 'c' ? 1 : 0);
        }
        for(int i = n; i >= 1; i -- ) {
            lasta[i] = lasta[i + 1] + (s[i - 1] == 'a' ? 1 : 0);
            lastb[i] = lastb[i + 1] + (s[i - 1] == 'b' ? 1 : 0);
            lastc[i] = lastc[i + 1] + (s[i - 1] == 'c' ? 1 : 0);
        }
        if(prea[n] < k || preb[n] < k || prec[n] < k) return -1;
        int l = 0, r = n;
        int res = find(0, n, k);
        return res;
    }
};

相关推荐
图码18 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0126 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie133 分钟前
实数列的常用递推模式
算法
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
leoufung1 小时前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展
小O的算法实验室1 小时前
2026年IEEE TETCI,山区环境下基于双种群进化的协同无人机巡逻任务协同优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
生成论实验室2 小时前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法