zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    2018 南京网络预赛Sum
    一个莫比乌斯等式的证明
    LOJ 2452 对称 Antisymmetry——用hash求回文串数
    LOJ 103子串查找——用hash代替kmp算法
    LOJ2823 三个朋友 ——查询字串的哈希值
    hash入门
    2019牛客暑期多校训练营(第十场)Coffee Chicken——递归
    2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理
    mutex 的 可重入
    Linux 编译安装Boost
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235382.html
Copyright © 2011-2022 走看看