• 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 }
  • 相关阅读:
    基于tensorflow的简单线性回归模型
    msm8909平台JEITA配置和bat-V therm表合入
    开始点滴积累
    消息队列中间件(一)介绍
    Ubuntu18 的超详细常用软件安装
    IO通信模型(三)多路复用IO
    IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)
    IO通信模型(一)同步阻塞模式BIO(Blocking IO)
    Web笔记(二)Tomcat 使用总结
    const in C/C++
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235382.html
Copyright © 2020-2023  润新知