• 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 }
  • 相关阅读:
    bootstrap table中显示头行结构
    利用bootstrap的modal和tab制作的联动自定义UI
    oracle plsql练习题-考核题
    oracle pl/sql 几道基础的编程题
    洛谷 P1156 垃圾陷阱
    洛谷 3373 线段树练习
    JZOJ 5842
    JZOJ 5849 d
    JZOJ 4735. 最小圈
    JZOJ 4742. 单峰
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235382.html
Copyright © 2020-2023  润新知