zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946518.html
Copyright © 2011-2022 走看看