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

至少有k个重复字符的最长子串

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

示例 1:

输入:

s = "aaabb", k = 3

 

输出:

3

 

最长子串为 "aaa" ,其中 'a' 重复了 3 次。

示例 2:

输入:

s = "ababbc", k = 2

 

输出:

5

 

最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

 

要求是找出最长的子串,子串中的每一个字符都要重复至少k次。

 

 

思路是分治法。

要找s[i,j]的最大子串,先统计频数,然后遍历一遍频数,找出第一个频数小于k且大于0的字符,然后找出这个字符的位置,接下来的分析很重要,这个字符一定不能出现在任何的子串中,因为i,j是整个的子串,在ij里面频数都没有达到k,那么在ij的任何子串中,这个字符也不可能达到频数k。所以不能有这个字符,那么就在这个位置做一个分治,返回前半部分和后半部分的最大值。

 

 1 import java.util.Stack;
 2 
 3 public class Solution{
 4     public int longestSubstring(String s, int k) {
 5         return longestSubstringSub(s, k, 0, s.length() - 1);
 6     }
 7 
 8     private int longestSubstringSub(String s, int k, int start, int end){
 9         if(start > end) return 0;
10         int[] count = new int[26];
11         for(int i = start; i <= end; i++){
12             count[s.charAt(i) - 'a']++;
13         }
14         for(int i = 0; i < 26; i++){
15             if(count[i] > 0 && count[i] < k){
16                 int pos = s.indexOf((char)(i + 'a'), start);
17                 return Math.max(longestSubstringSub(s, k, start, pos - 1), longestSubstringSub(s, k, pos + 1, end));
18             }
19         }
20         return end - start + 1;
21     }
22 }

 

posted on 2019-01-07 20:08  kexinxin  阅读(838)  评论(0编辑  收藏  举报

导航