至少有K个重复字符的最长子串

给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。

如果不存在这样的子字符串,则返回 0。

示例 1:

复制代码
输入:s = "aaabb", k = 3
输出:3
解释:最长子串为 "aaa" ,其中 'a' 重复了 3 次。

示例 2:

复制代码
输入:s = "ababbc", k = 2
输出:5
解释:最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

思路:滑动窗口,没有条件滑就创造条件滑。规定 t 为滑动窗口内最大的字母种类(当取所有可能的 t 时,也就相当于全集了,等于没规定这个条件)。虽然最大种类数为 t 时,t-1可能也会被考虑一些次,但是一定会考虑到长度 仅为 t 的所有情况。而最后的res 一定是某个数目的 字母种类 ,所以一定可以考虑到。

设置 existNum、reachNum 两个变量,一个是存在字母种类数量,一个数到达k数目要求的字母种类数

python 复制代码
from collections import defaultdict


class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        charSet = set(s)
        res = 0
        # 滑动窗口内最大的字母种类
        for t in range(1,len(charSet)+1):
            exist=defaultdict(int)
            existNum=0
            reachNum=0
            l,r=0,0
            while r<len(s):
                exist[s[r]] += 1
                # 存在
                if exist[s[r]] == 1:
                    existNum += 1
                # 满足
                if exist[s[r]] == k:
                    reachNum += 1

                while l<=r and existNum>t:
                    exist[s[l]]-=1
                    if exist[s[l]]==0:
                        existNum-=1

                    if exist[s[l]] == k-1:
                        reachNum -= 1
                    l += 1

                if reachNum==existNum:
                    res=max(res,r-l+1)
                r += 1

自己写的一版错误的:

没有最外层的 t ,这样滑 处理不了 "baaabcb" 这种情况。

python 复制代码
from collections import defaultdict


class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        res = 0
        characterDict=defaultdict(int)
        for c in s:
            characterDict[c]+=1
        exist=defaultdict(int)
        existNum=0
        reachNum=0
        l,r=0,0
        while r<=len(s):
            if r==len(s) or exist[s[r]]+characterDict[s[r]]<k:
                while l<r and reachNum<existNum:
                    exist[s[l]]-=1
                    if exist[s[l]]==0:
                        existNum-=1

                    if exist[s[l]] == k-1:
                        reachNum -= 1
                    l += 1

                res=max(res,r-l)
                l=r=r+1

            else:
                exist[s[r]] += 1
                #存在
                if exist[s[r]]==1:
                    existNum+=1

                #满足
                if exist[s[r]]==k:
                    reachNum+=1
                r+=1
        return res
print(Solution().longestSubstring("baaabcb", 3))
相关推荐
倒头就睡的小比特15 小时前
算法竞赛C++常用的STL
c++·算法
默_笙15 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!15 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_4260039615 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫16 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技16 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读16 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼16 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时17 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
m0_5474866617 小时前
《数据结构教程》全套 PPT课件2026
数据结构