记力扣2516.每种字符至少取k个 练习理解

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

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

考虑到从正面做(即统计所有字符的数量然后分别从最左边遍历和右边遍历去减去总数,相对有点复杂),采用正难则反的办法,题目需要返回最少分钟数,我变相求出最长的数组且保证剩余k个所求每种字符即可,最后返回n-max_len即为最少分钟数

复制代码
from collections import counter
class Solution:
    def takeCharacters(self,s:str,k:int)->int:
        cnt=counter(s)
        n=len(s)
        max_len=left=0
        if any(cnt[c]<k for c in "abc"):
            return -1
        for i,char in enumerate(s):
            cnt[char] -=1
            while cnt[char]<k:
                cnt[s[left]]+=1
                left +=1
            max_len=max(max_len,i-left+1)
        return n-max_len

难点:

我认为是能够想到这种办法,这种正难则反的思路,认识到 "最少取出字符数" 等价于 "最多保留字符数",而 "最多保留字符数" 又等价于 "从原始字符串中移除一段连续子串后剩下的字符数最多"

相关推荐
颜酱12 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub16 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub16 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub16 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub16 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub16 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP1 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP1 天前
一文搞懂激活函数!
算法·面试
董董灿是个攻城狮1 天前
AI 视觉连载7:传统 CV 之高斯滤波实战
算法