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;
        }
    }
    
  • 相关阅读:
    flex>数据绑定、数据列表 小强斋
    上周问题总结与解决方案
    asp.net 实现无限级分类
    发个项目需求大家瞅瞅
    ASP.NET POST模拟登陆
    HttpWebRequest发送数据 post
    asp.net 生成静态页面
    xcode4.1自带SVN配置
    模拟登录
    C#中用HttpWebRequest/HttpWebResponse来发送/接收数据
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075755.html
Copyright © 2011-2022 走看看