记力扣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=0if any(cnt[c]<k for c in "abc"):return -1for i,char in enumerate(s):cnt[char] -=1while cnt[char]<k:cnt[s[left]]+=1left +=1max_len=max(max_len,i-left+1)return n-max_len
难点:
我认为是能够想到这种办法,这种正难则反的思路,认识到 "最少取出字符数" 等价于 "最多保留字符数",而 "最多保留字符数" 又等价于 "从原始字符串中移除一段连续子串后剩下的字符数最多"