• Java实现 LeetCode 395 至少有K个重复字符的最长子串


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

    找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。

    示例 1:

    输入:
    s = “aaabb”, k = 3

    输出:
    3

    最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。
    示例 2:

    输入:
    s = “ababbc”, k = 2

    输出:
    5

    最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。

    class Solution {
       public int longestSubstring(String s, int k) 
        {
            int len = s.length();
            if (len == 0 || k > len)
            {
                return 0;
            }
            if (k < 2)
            {
                return len;
            }
            return count(s.toCharArray(), k, 0, len - 1);
        }
    
        private static int count(char[] chars, int k, int left, int right) 
        {
            if (right - left + 1 < k) return 0;
            int[] times = new int[26];  //  26个字母
            for (int i = left; i <= right; ++i) 
            {
                times[chars[i] - 'a']++;//统计每个字母出现的次数,字符出现频次小于k,则不可能出现在结果子串中
            }
            //分别排除,然后挪动两个指针
            while (right - left + 1 >= k && times[chars[left] - 'a'] < k) 
            {
                ++left;
            }
            while (right - left + 1 >= k && times[chars[right] - 'a'] < k) 
            {
                --right;
            }
    
            if (right - left + 1 < k)//排除到剩余的字符串小于k,则直接return
            {
                return 0;
            }
            //  得到临时子串,再递归处理
            for (int i = left; i <= right; ++i) 
            {
                //  如果第i个不符合要求,切分成左右两段分别递归求得
                if (times[chars[i] - 'a'] < k) 
                {
                    return Math.max(count(chars, k, left, i - 1), count(chars, k, i + 1, right));
                }
            }
            return right - left + 1;
        }
    }
    
  • 相关阅读:
    通过scp拷贝文件时无需交互输入密码
    suse linux安装lrzsz
    shc加密shell脚本
    linux小程序--cmatrix
    linux系统PXE+Kickstart自动安装系统
    升级SSH
    shell生成随机数的几种方法
    django —— MVT模型
    Django学习---笔记一
    python学习--Django虚拟环境搭建
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075127.html
Copyright © 2020-2023  润新知