classSolution:deftakeCharacters(self, s:str, k:int)->int:"""
与其维护窗口内的字母个数,不如直接维护窗口外的字母个数,这也是我们取走的字母个数。
一开始,假设我们取走了所有的字母。或者说,初始窗口是空的,窗口外的字母个数就是 s 的每个字母的出现次数。
右端点字母进入窗口后,该字母取走的个数减一。
如果减一后,窗口外该字母的个数小于 k,说明子串太长了,或者取走的字母个数太少了,那么就不断右移左端点,
把左端点字母移出窗口,相当于我们取走移出窗口的字母,直到该字母个数等于 k,退出内层循环。
内层循环结束后,用窗口长度 right−left+1 更新子串长度的最大值。
"""
cnt = Counter(s)# 直接维护窗口外的字母个数ifany(cnt[c]< k for c in"abc"):return-1
mx = left =0for right, c inenumerate(s):
cnt[c]-=1while left <= right and cnt[c]< k:
cnt[s[left]]+=1
left +=1
mx =max(mx, right - left +1)returnlen(s)- mx