Leetcode 395.至少有k个重复字符的最长子串
至少有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 次。
要求是找出最长的子串,子串中的每一个字符都要重复至少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 }