图解leetcode —— 395. 至少有K个重复字符的最长子串
前言:
每道题附带动态示意图,提供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个重复字符的最长子串的更多相关文章
- Java实现 LeetCode 395 至少有K个重复字符的最长子串
395. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度. 示例 1: 输入: s = " ...
- leetcode 395 至少有K个重复字符的最长子串
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度. 示例 1: 输入: s = "aaabb", k = 3 输 ...
- 395.至少有 K 个重复字符的最长子串
题目 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k .返回这一子串的长度. 示例 1: 输入:s = "aaabb" ...
- 395. 至少有K个重复字符的最长子串
Q: A: 分治,对于字符串s的任何一个字符,如果它的频数(在s中出现的次数)小于k,则它一定不会出现在最后的结果里,也就是从它的位置一劈两半,考察左右.对于当前字符串s,我们先建立字典统计其中每种字 ...
- 395 Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子串
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度.示例 1:输入:s = "aaabb", k = 3输出:3最 ...
- [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 ...
- LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)
LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...
- leetcode刷题笔记-3. 无重复字符的最长子串(java实现)
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- LeetCode随缘刷题之无重复字符的最长子串
欢迎评论区交流. package leetcode.day_12_04; /** * 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. * <p> * 示例1: * &l ...
随机推荐
- [考试反思]1105csp-s模拟测试101: 临别
先不改题,这次主要不在T3上. 这次有必要粘文件得分了. 临考前总解锁新锅我也不知道这是什么个事啊... T1宏定义写挂.因为原来在OJ上没事所以一直没注意.在Lemon评测下直接全部RE. GG在主 ...
- NOIP模拟 18
这次时间分配不合理,沉迷大模拟无法自拔 虽然A了但是根本就没给T3留时间555 T3如果有时间看看数据范围应该可以想到QJ掉20分的555 T1 引子 打这题的时候感觉自己在做图像处理.. 然后调了各 ...
- day1-python初识以及变量
一.变量:将输入的内容赋值给变量,即变量=输入的内容 n1=input('请输入用户名:') 二. 变量名可以是 -英文. -数字.数字不能开头 -下划线,但是不可以下划线开头 不能是关键字 'and ...
- 关于Jvm的见解(二)
栈管运行,堆管存储!!! 栈呢,也叫作栈内存,主要管java程序的运行,在线程创建时创建,生命周期和线程一致,只要线程一结束,该栈就被GC,是线程私有的.基本类型的变量和对象的引用数据类型的变量都在栈 ...
- 深入理解计算机系统 第三章 程序的机器级表示 part2
这周由于时间和精力有限,只读一小节:3.4.4 压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令 ...
- ASP.NET Core 1.0: API的输入参数
Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...
- UML分析AsyncDisplayKit框架-ASMuplexImageNode异步下载时序图。
PS:博客园图片服务器不正常工作,数据上传后服务器返回http500,园方迟迟还没解决. 我从2016-01-18 05:52向园方反馈问题-请问博客园的图片服务器有在正常运行吗,至此时2016-01 ...
- asp.net Mvc 使用NPOI导出Excel文件
1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...
- 遗忘root密码,应该如何修改?[CentOS7.5]
https://www.lanzous.com/i71hw6d 下载视频演示 实验环境:VMware Workstation [CentOS7.5]遗忘root用户密码 应该如何修改??? 设置BIO ...
- Docker从入门到实践(4-1)
使用 Docker 镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一. Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像. ...