leetcode力扣刷题系列——【每种字符至少取 K 个】

news2024/10/1 3:31:18

题目

给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。
你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1 。

示例 1:
输入:s = “aabaaaacaabc”, k = 2
输出:8

解释:
从 s 的左侧取三个字符,现在共取到两个字符 ‘a’ 、一个字符 ‘b’ 。
从 s 的右侧取五个字符,现在共取到四个字符 ‘a’ 、两个字符 ‘b’ 和两个字符 ‘c’ 。
共需要 3 + 5 = 8 分钟。
可以证明需要的最少分钟数是 8 。

示例 2:
输入:s = “a”, k = 1
输出:-1
解释:无法取到一个字符 ‘b’ 或者 ‘c’,所以返回 -1 。

提示:
1 <= s.length <= 105
s 仅由字母 ‘a’、‘b’、‘c’ 组成
0 <= k <= s.length

答案:

为什么今天只有答案呢,以为这个题我没有靠自己做出来,而是看了答案后做出来得,所以这道题我不配告诉大家怎么写,那么让我们看看官方的答案和解题思路吧。
先看解题思路
思路
按照题意所述,从最左和最右侧取走后,原字符串还剩下一个连续的区间,那么可以转化为求一个最长的子区间,使得区间两边的所有字符加起来满足题目要求。当满足题意要求时,显然区间长度越长,取得的字符就越少。所以当右端点 r 固定时,最优的情况是找到一个最小的左端点 l 使得取走的字符最少,并且随着左端点 r 右移动,满足要求的 l 也会往右移动。针对这种情况,可以采用双指针的做法,先扫一遍使得每个字符都进行计数然后存到 cnt 数组中,如果不满足题意要求直接返回 −1 即可。左右指针一开始都从 0 开始,优先移动右指针 r,每移动一次 r 表示把这个字符添加到最后还剩下的集合中,所以应该在计数中减去。

  • 如果此时计数数组 cnt 中每一个元素都大于等于 k,则表示满足题目要求直接更新答案。
  • 如果 cnt 中存在一个元素小于 k,则移动左指针 l,表示要拿掉这个字符。所以应该计数添加到 cnt
    中,持续移动左指针直到满足题目要求。

答案

class Solution:
    def takeCharacters(self, s: str, k: int) -> int:
        cnt = [0] * 3
        ans = len(s)

        for c in s:
            cnt[ord(c) - ord('a')] += 1
        if cnt[0] >= k and cnt[1] >= k and cnt[2] >= k:
            ans = min(ans, len(s))
        else:
            return -1

        l = 0
        for r, ch in enumerate(s):
            cnt[ord(ch) - ord('a')] -= 1
            while l < r and (cnt[0] < k or cnt[1] < k or cnt[2] < k):
                cnt[ord(s[l]) - ord('a')] += 1
                l += 1
            if cnt[0] >= k and cnt[1] >= k and cnt[2] >= k:
                ans = min(ans, len(s) - (r - l + 1))

        return ans

作者:力扣官方题解
链接:这个是链接地址
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android调用科大讯飞语音转写 API以及解析踩坑之旅

需求 需要对本地音频文件&#xff0c;调用科大讯飞的api进行转文字&#xff0c;本来呢&#xff0c;以为很简单&#xff0c;结果坑不少。 语音转写 API 文档 坑1&#xff1a;解析 下载demo&#xff0c;代码也挺简单&#xff0c;放到idea中&#xff0c;替换一下key&#xff0c…

基于Springboot+Vue的网上书店(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在这个…

用户体验测试——21条UX设计原则

根据心理学的研究和发展,对应理论不断被完善到用户体验设计领域,以下21条UX设计原则即为心理学在用户体验设计中的应用,在设计和测试中应用这些原则,可以提高用户体验质量特性,如下所示: 21条UX设计原则 有效性 特斯勒定律(最小复杂度定律) 这个定律也被称为“复杂性…

数据转换新利器,开启企业高效之路

Maria是 S 公司的采购专员&#xff0c;最近需要进行公司设备的采购&#xff0c;这可让她犯了难&#xff1a;公司多个部门提交采购申请&#xff0c;但每个部门都有着不同的需求。一时间她就收到了大量的申请单&#xff0c;却难以高效整合处理&#xff08;比如哪些申请可以合并采…

环境变量

见一见环境变量&#xff1a; 查看环境变量的命令 命令行&#xff1a; echo &PATH echo &HOME env ps ajx ps aux ps -f -o pid code.c中获取环境变量 main&#xff08;char* env[]&#xff09; char* getenv&#xff08;env_name&#xff09; 本地变量 shell…

App模拟下载场景的demo

摘要 目的&#xff1a;提供一个稳定的下载场景&#xff0c;可以手动触发和定时触发下载&#xff0c;每次下载相同大小文件&#xff0c;研究下载场景的功耗影响 原理&#xff1a;把电脑当做服务器&#xff0c;手机测试App固定下载电脑存放的某个XXXMB的大文件&#xff0c;基于…

如何使用ssm实现校园体育赛事管理系统的设计与实现+vue

TOC ssm713校园体育赛事管理系统的设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得…

PE节表中是否存在misc.VirtualSize 比SizeofRawData还要大的情况

确实是存在的,这是win10自带记事本,可以看到 确实是大.所以在申请imagebuffer的时候,还是需要比较大小.但是在还原的时候.只考虑sizeofRawData即可>

【Android 14源码分析】WMS-窗口显示-第一步:addWindow

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

项目管理专业资质认证ICB 3中关于项目经理素质的标准

项目管理专业资质认证ICB 3中关于项目经理素质的标准&#xff0c;的确很全面&#xff0c;下面摘录之&#xff1a;

三款专业的英文文献翻译工具,翻译论文不在话下

阅读英文论文文献时免不了要借用一些翻译软件来帮助理解&#xff0c;但因为论文文献的特殊性&#xff0c;普通的翻译软件不能很好的翻译一些专业名词和术语&#xff0c;所以这里给大家分享三款可以胜任文献翻译的专业翻译工具&#xff0c;可以快速准确的完成英文文献翻译工作。…

CDGA|2024年数据治理的六个关键建议

随着数字经济的快速发展&#xff0c;数据已成为企业运营和决策的核心资产。在2024年&#xff0c;做好数据治理对于提升企业的竞争力和运营效率至关重要。以下是六个关键建议&#xff0c;帮助企业有效应对数据治理的挑战。 1. 制定明确的数据治理策略 首先&#xff0c;企业需要…

遥感影像-实例分割数据集:iSAID 从切图到YOLO格式数据集制作详细介绍

背景介绍 开源数据集isaid标注包含实例分割&#xff0c;但是原始影像太大&#xff0c;很吃显存&#xff0c;一般显卡无法用原始影像直接训练&#xff0c;所以需要对影像进行裁剪&#xff0c;并生成对应的标签&#xff0c;因为想用yolo系列跑模型&#xff0c;所以将标签需要转为…

【设计模式-模板】

定义 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义了一个算法的骨架&#xff0c;并将一些步骤延迟到子类中实现。通过这种方式&#xff0c;模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…

Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?

Java 选择 UTF-16 编码而不是更节省内存的 UTF-8 这一决定&#xff0c;涉及多个层面的设计权衡&#xff0c;包括历史原因、虚拟机&#xff08;JVM&#xff09;实现的复杂度、性能和字符处理的一致性。要理解这个问题&#xff0c;我们需要从 Java 语言的设计初衷、JVM 的工作机制…

C++:笔试题

1.什么是虚函数&#xff1f;什么是纯虚函数&#xff1f; 虚函数是类中的一个成员函数&#xff0c;使用关键字virtual在函数名前声明。 虚函数主要目的是允许子类重写父类中的同名函数&#xff0c;从而实现多态性&#xff0c;并且子函数重写的是虚函数表中的函数。 当通过父类的…

七、添加攻击音效

一、添加动画事件 1、在动画事件中添加音效 2、添加音频组件 3、代码 public void PlayAttackSound() {AudioSource1.PlayOneShot(AudioClip1, SoundValue);//PlayOneShot播放一个音频剪辑&#xff08;AudioClip&#xff09;一次 }

Oracle 日志文件多路复用

多路复用 PRODCDB 数据库的所有日志组中的 redo log 文件&#xff0c;存放目录&#xff1a; /u01/app/oracle/oradata/MREDO 1.创建目录 mkdir -p /u01/app/oracle/oradata/MREDO 2.查看日志文件路径 select group#,member from v$logfile; 3.增加日志组文件 alter database a…

ElementUI el-tree 树组件 增加辅助线

需求 项目需求给elementUI的el-tree添加辅助线&#xff0c;并且不能使用其他插件&#xff0c;没办法只能该样式了。 效果 代码 html <template><div><el-scrollbar class"long-content"><el-tree node-key"id":data"deptTre…

《程序猿之Redis缓存实战 · 有序集合类型》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…