• 小黑leetcode之旅:95. 至少有 K 个重复字符的最长子串


    小黑java解法1:分治法

    class Solution {
        public int longestSubstring(String s, int k) {
            return dfs(s, 0, s.length() - 1, k);
        }
        public int dfs(String s, int left, int right, int k) {
            if (left > right) {
                return 0;
            }
            int[] cnt = new int[26];
            for (int i = left; i <= right; i++) {
                cnt[s.charAt(i) - 'a']++;
            }
            int res = 0;
            int start = left;
            boolean flag = false;
            System.out.println(left+"+"+right);
            for(int i = left; i <= right; i++) {
                if (cnt[s.charAt(i) - 'a'] < k) {
                    System.out.println(i);
                    int p = dfs(s, start, i-1, k);
                    if(p > res){
                        res = p;
                    }
                    flag = true;
                    start = i + 1;
                } 
            }
            if(flag){
                int p = dfs(s, start, right, k);
                if(p > res){
                    res = p;
                }
                return res;
            }
            return right - left + 1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    小黑python解法1:分治法

    class Solution:
        def longestSubstring(self, s: str, k: int) -> int:
            l = len(s)
            
            def substring(s,start,end):
                counts = {}
                for c in s[start:end+1]:
                    counts[c] = counts.get(c,0) + 1
                # 生成分割点
                splits = []
                for key in counts:
                    if counts[key] < k:
                        splits.append(key)
                if not splits:
                    return end - start + 1
                i = start
                res = 0
                while i <= end:
                    while i <= end and s[i] in splits:
                        i += 1
                    if i > end:
                        break
                    start = i
                    while i <= end and s[i] not in splits:
                        i += 1
                    length = substring(s,start,i-1)
                    res = max(length,res)
                return res
            return substring(s,0,l-1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述

    分治法

    class Solution:
        def longestSubstring(self, s: str, k: int) -> int:
            l = len(s)
    
            def subString(start,end):
                counts = {}
                # 记录子串中每一个字符的频率
                for c in s[start:end+1]:
                    counts[c] = counts.get(c,0) + 1
                # 筛选出频率小于k的一个字符
                split = None
                for c in counts.keys():
                    if counts[c] < k:
                        split = c
                        break
                # 所有字符符合要求,则return
                if not split:
                    return end - start + 1
                i = start
                ans = 0
                while start <= end:
                    while i <= end and s[i] == split:
                        i += 1
                    if i > end:
                        break
                    start = i
                    while i <= end and s[i] != split:
                        i += 1
                    ans = max(ans,subString(start,i-1))
                return ans
            return subString(0,l-1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    BIGEMAP GIS Office
    Java8-CompletableFuture的使用
    BGP的基本配置
    Flutter入门到精通:学习路线与思路
    论文阅读 | RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
    数据库调优经验记录【MySQL】
    物联网实战--入门篇之(七)嵌入式-MQTT
    洛谷 P1909 [NOIP2016 普及组] 买铅笔
    你这个视频背景太假了?
    区块链技术的未来:去中心化应用和NFT的崛起
  • 原文地址:https://blog.csdn.net/qq_37418807/article/details/126113058