Longest Substring with At Least K Repeating Characters

Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

思路:先统计每个字母出现的频次,如果小于k,那么这个字母必定不会出现在符合要求的子字符串中,那么以此字母为分界点,把字符串分割,重复以上步骤。分治一般会有左右边界,因此,我们可以通过设置左右边界的指针,从字符串两端同时开始进行,遇到频次小于k的字母则跳过,不断往中间收缩,缩减可能符合要求的子字符串的范围。

class Solution {
    public int longestSubstring(String s, int k) {
        int length = s.length();
        if(length == 0 || length < k)
        {
            return 0;
        }
        if(k < 2)
        {
            return length;
        }
        
        return getResult(s.toCharArray(), k, 0, length - 1);
    }
    
    public static int getResult(char[] chars, int k, int left, int right)
    {
        if(right - left + 1 < k)
        {
            return 0;
        }
        int[] times = new int[26];
        for(int i = left; i <= right; i++)
        {
            times[chars[i] - 'a']++;
        }
        
        while(right - left + 1 >= k && times[chars[left] - 'a'] < k)
        {
            left++;
        }
        while(right - left + 1 >= k && times[chars[right] - 'a'] < k)
        {
            right--;
        }
        for(int i = left; i <= right; i++)
        {
            if(times[chars[i] - 'a'] < k)
            {
                return Math.max(getResult(chars, k, left, i - 1), getResult(chars, k, i + 1, right));
            }
        }
        return right - left + 1;
    }
}

 

posted on 2020-04-23 11:07  Jain_Shaw  阅读(104)  评论(0编辑  收藏  举报

导航