前言:

每道题附带动态示意图,提供java、python两种语言答案,力求提供leetcode最优解。

描述:

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

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

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

示例 2:

输入:
s = "ababbc", k = 2

输出:
5

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

思路:

这道题可以用滑动窗口+分治的方法进行解答。

java:

class Solution {

    /**
* 计算最长重复子串长度.
*
* @param s 字符串
* @param k 重复次数
* @return 长度
*/
public int longestSubstring(String s, int k) {
int len = s.length();
if (len == 0 || k > len) {
return 0;
}
if (k < 2) {
return len;
}
return countHandler(s.toCharArray(), k, 0, len - 1);
} /**
* 计算最长重复子串长度逻辑处理
*
* @param chars 字符数组
* @param k 重复次数
* @param start 开始位置
* @param end 结束位置
* @return 长度
*/
private int countHandler(char[] chars, int k, int start, int end) {
if (k > end - start + 1) {
return 0;
}
// 计数器,26代表个字母
int[] times = new int[26];
// 统计字符频率
for (int i = start; i <= end; i++) {
++times[chars[i] - 'a'];
}
// 起点、终点夹逼,去掉首位不符合条件的字符串(滑动窗口)
while (k <= end - start + 1 && times[chars[start] - 'a'] < k) {
start++;
}
while (k <= end - start + 1 && times[chars[end] - 'a'] < k) {
end--;
}
if (k > end - start + 1) {
return 0;
}
// 字符串中间存在不符合条件的字符,即以该字符串为界,分割前子串和后字串,进行计算(分治)
for (int i = start; i <= end; i++) {
if (times[chars[i] - 'a'] < k) {
return (Math.max(countHandler(chars, k, start, i - 1), countHandler(chars, k, i + 1, end)));
}
}
return end - start + 1;
}
}

结果:

python3:

class Solution:
def longestSubstring(self, s: str, k: int) -> int:
length = len(s)
if length == 0 or k > length:
return 0
if k < 2:
return length def countHandler(s: str, k: int, start: int, end: int) -> int:
if k > end - start + 1:
return 0
# 初始化数组
times = [0 for i in range(0, 27)]
for i in range(start, end + 1):
times[ord(s[i]) - ord('a')] += 1
# 起点、终点夹逼,去掉首位不符合条件的字符串(滑动窗口)
while end - start + 1 >= k > times[ord(s[start]) - ord('a')]:
start += 1
while end - start + 1 >= k > times[ord(s[end]) - ord('a')]:
end -= 1
if k > end - start + 1:
return 0
# 字符串中间存在不符合条件的字符,即以该字符串为界,分割前子串和后字串,进行计算(分治)
for i in range(start, end):
if times[ord(s[i]) - ord('a')] < k:
return max(countHandler(s, k, start, i - 1), countHandler(s, k, i + 1, end))
return end - start + 1 return countHandler(s, k, 0, length - 1)

结果:

图解leetcode —— 395. 至少有K个重复字符的最长子串的更多相关文章

  1. Java实现 LeetCode 395 至少有K个重复字符的最长子串

    395. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度. 示例 1: 输入: s = " ...

  2. leetcode 395 至少有K个重复字符的最长子串

    找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度. 示例 1: 输入: s = "aaabb", k = 3 输 ...

  3. 395.至少有 K 个重复字符的最长子串

    题目 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k .返回这一子串的长度. 示例 1: 输入:s = "aaabb" ...

  4. 395. 至少有K个重复字符的最长子串

    Q: A: 分治,对于字符串s的任何一个字符,如果它的频数(在s中出现的次数)小于k,则它一定不会出现在最后的结果里,也就是从它的位置一劈两半,考察左右.对于当前字符串s,我们先建立字典统计其中每种字 ...

  5. 395 Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子串

    找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度.示例 1:输入:s = "aaabb", k = 3输出:3最 ...

  6. [Swift]LeetCode395. 至少有K个重复字符的最长子串 | Longest Substring with At Least K Repeating Characters

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  7. LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)

    LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...

  8. leetcode刷题笔记-3. 无重复字符的最长子串(java实现)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  9. LeetCode随缘刷题之无重复字符的最长子串

    欢迎评论区交流. package leetcode.day_12_04; /** * 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. * <p> * 示例1: * &l ...

随机推荐

  1. TCP/IP协议第一卷第一章

    1.链路层 链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.把链路层地址和网络层地址联系起来 ...

  2. docker安装mysql,tomcat,并且在tomcat可以访问到mysql

    1.uname -an 查看当前系统版本 2.yum -y install docker 下载安装docker 3.service docker start  启动docker服务 4.docker ...

  3. 一、EditPlus 的安装 - Java软件的安装

    EditPlus:该软件的功能类似于windows的文本编辑器,可处理文本.HTML和程序语言的Windows编辑器. 1.安装包的下载:http://pan.baidu.com/s/1qW1akZq ...

  4. .netcore之DI批量注入(支持泛型) - xms

    一旦系统内模块比较多,按DI标准方法去逐个硬敲AddScoped/AddSingleton/AddTransient缺乏灵活性且效率低下,所以批量注入提供了很大的便捷性,特别是对于泛型的服务类,下面介 ...

  5. web常用自动化库——selenium总结

    概述 selenium是一个模拟控制浏览器操作的自动化库,它可以做到元素定位,鼠标事件,浏览器事件,js脚本执行等操作 与request不同的是,request是单独请求一个http,而seleniu ...

  6. activmq点对点(简单写法)

    开发环境 我们使用的是ActiveMQ 5.11.1 Release的Windows版,官网最新版是ActiveMQ 5.12.0 Release,大家可以自行下载,下载地址. 需要注意的是,开发时候 ...

  7. lqb 基础练习 十进制转十六进制

    基础练习 十进制转十六进制 时间限制:1.0s   内存限制:512.0MB     问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式.它有0,1,2,3,4,5,6,7,8,9,A ...

  8. nyoj 26-孪生素数问题(打表)

    26-孪生素数问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:43 题目描述: 写一个程序,找出给出素数范围内的所有孪生素数 ...

  9. nyoj 73-比大小 (Java, 高精度)

    73-比大小 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:64 难度:3 题目描述: 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如1234567891 ...

  10. nyoj 599-奋斗的小蜗牛 (double ceil(); (temp - 1) / 5)

    599-奋斗的小蜗牛 内存限制:64MB 时间限制:1000ms 特判: No 通过数:0 提交数:96 难度:1 题目描述: 传说中能站在金字塔顶的只有两种动物,一种是鹰,一种是蜗牛.一只小蜗牛听了 ...