当前位置: 首页 > article >正文

leetcode.每日一题.2516.每种字符至少取 K 个

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

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

错误代码,不能从两边考虑,思路错误。

class Solution {
public:
    int takeCharacters(string s, int k) {
        if(k==0)return 0;
        int n=s.length();
        vector<int>idex;
        int num[4];
        memset(num,0,sizeof num);
        for(int i=0;i<n;i++)
        {
            idex.push_back(++num[int(s[i]-'a')]);
        }
        // for(int i=0;i<n;i++)
        // {
        //     cout<<idex[i]<<endl;
        // }
        for(int i=0;i<3;i++)
        {
            if(num[i]<k)return -1;
        }
        vector<bool>choose(n,0);
        for(int i=0;i<n;i++)
        {
            if(idex[i]<=k)choose[i]=1;
        }
        int m=0;int maxM=0;
        for(int i=0;i<n;i++)
        {
            if(choose[i]==0)
            {
                m+=1;
            }
            else if(choose[i]==1)
            {
                m=0;
            }
            maxM=max(maxM,m);
        }

        return n-maxM;
        
    }
};

然后看了官方题解的双指针算法,有点思路了。

class Solution {
public:
    int takeCharacters(string s, int k) {
        vector<int> cnt(3, 0);
        int len = s.size();
        int ans = len;
        for (int i = 0; i < len; i++) {
            cnt[s[i] - 'a']++;
        }
        if (cnt[0] >= k && cnt[1] >= k && cnt[2] >= k) {
            ans = min(ans, len);
        } else {
            return -1;
        }

        int l = 0;
        for (int r = 0; r < len; r++) {
            cnt[s[r] - 'a']--;
            while (l < r && (cnt[0] < k || cnt[1] < k || cnt[2] < k)) {
                cnt[s[l] - 'a']++;
                l++;
            }
            if (cnt[0] >= k && cnt[1] >= k && cnt[2] >= k) {
                ans = min(ans, len - (r - l + 1));
            }
        }

        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/take-k-of-each-character-from-left-and-right/solutions/2928177/mei-chong-zi-fu-zhi-shao-qu-k-ge-by-leet-10ct/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首次AC代码

class Solution {
public:
    int takeCharacters(string s, int k) {
        if(k==0)return 0;
        int n=s.length();
        int num[4];
        memset(num,0,sizeof num);
        for(int i=0;i<n;i++)
        {
            ++num[int(s[i]-'a')];
        }
        for(int i=0;i<3;i++)
        {
            if(num[i]<k)return -1;
        }
        int l=-1;
        int maxL=0;
        for(int r=0;r<n;r++)
        {
            num[s[r]-'a']-=1;
            while(l<r&&(num[0]<k||num[1]<k||num[2]<k))
            {
                l+=1;
                num[s[l]-'a']+=1;
            }
            maxL=max(maxL,r-l);
        }
        return n-maxL;
      
        
    }
};

今日完结撒花~

 


http://www.kler.cn/news/329619.html

相关文章:

  • 【C++】C++基础
  • 魔都千丝冥缘——软件终端架构思维———未来之窗行业应用跨平台架构
  • D21【python接口自动化学习】-python基础之内置数据类型
  • Git记录
  • C语言:排序(1)
  • 毕业设计选题:基于ssm+vue+uniapp的家庭记账本小程序
  • 在线远程考试|基于springBoot的在线远程考试系统设计与实现(附项目源码+论文+数据库)
  • 【C++】“list”的介绍和常用接口的模拟实现
  • 进程通信——内存映射
  • Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(文档+源码+数据库)
  • [大语言模型-论文精读] 阿里巴巴-通过多阶段对比学习实现通用文本嵌入
  • 从0开始实现es6 promise类
  • 【可答疑】基于51单片机的体温心率血氧检测系统(含仿真、代码、报告等)
  • I2C-Tools的安装与使用方法(详解,一篇教会你熟练使用)
  • 数据库索引和磁盘的关系大揭秘
  • Leetcode 3307. Find the K-th Character in String Game II
  • 无线通信系统仿真与原型设计:MATLAB实践指南
  • LDRA Testbed(TBrun)软件集成测试(部件测试)_操作指南
  • postgresql僵尸进程的处理思路
  • 一文带你入门客制化键盘,打造专属打字利器
  • 大数据常问八股文面试题【数据倾斜,现象、本质原因、解决方案】
  • OpenCV视频I/O(3)视频采集类VideoCapture之获取当前使用的视频捕获 API 后端的名称函数getBackendName()的使用
  • 【含文档】基于Springboot+微信小程序 的中心医院用户移动端(含源码+数据库+lw)
  • vim(1) -- 环境配置
  • 电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)
  • PLMN NR cell
  • Nature Machine Intelligence 基于强化学习的扑翼无人机机翼应变飞行控制
  • 网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?
  • 深度优先搜索算法改进:分类与打印有向图中的每条边
  • 【Canvas与艺术】六鱼六燕铁艺壁画