至少有K个重复字符的最长子串
时间:2022-07-22
本文章向大家介绍至少有K个重复字符的最长子串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述:
找到给定字符串(由小写字符组成)中的最长子串T , 要求T 中的每一字符出现次数都不少于 k 。输出 T的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
大体思路
对于子串T,T中一字母t,若t出现次数小于k,则任何包含t的子串都是不满足条件的。
利用该特性,将T可以划分为两段,t之前的一段,t之后的一段,结果转化为求这两个子串的至少含k个重复字符的最长子串问题。
实现代码如下:
class Solution {
public int longestSubstring(String s, int k) {
return process(s, k, 0, s.length() - 1);
}
public int process(String s, int k, int left, int right){
if(right - left + 1 < k){
return 0;
}
int[] counts = new int[26];
for(int i = left; i <= right; i++){
counts[s.charAt(i) -'a']++;
}
int mid = left;
while(mid <= right){
if(counts[s.charAt(mid) - 'a'] >= k){
mid++;
}else{
break;
}
}
if(mid == right + 1){
return mid - left;
}
return Math.max(process(s, k, left, mid - 1), process(s, k, mid + 1, right));
}
}
我们发现T中不止一个元素次数小于k,因此我们可以得到所有小于k的t,将T分为多个小段,如此可以减少大量中重复计算。实现代码如下:
class Solution {
public int longestSubstring(String s, int k) {
return process(s, k, 0, s.length() - 1);
}
public int process(String s, int k, int left, int right){
if(right - left + 1 < k){
return 0;
}
int[] counts = new int[26];
for(int i = left; i <= right; i++){
counts[s.charAt(i) -'a']++;
}
List<Integer> illage = new ArrayList<>();
for(int i = left; i <= right; i++){
if(counts[s.charAt(i) - 'a'] < k){
illage.add(i);
}
}
if(illage.size() == 0){
return right - left + 1;
}
int ans = 0;
for(int item : illage){
ans = Math.max(ans, process(s, k, left, item - 1));
left = item + 1;
}
return Math.max(ans, process(s, k, left, right));
}
}
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3)(A.B.C,3道暴力题,C可二分求解)
- [快学Python3]目录与文件操作
- Codeforces Round #411 (Div. 2)(A,B,C,D 四水题)
- [快学Python3]INI文件读写
- [快学Python3]迭代器和生成器
- [快学Python3]模块和包
- 除法取模与逆元/费马小定理
- [快学Python3]类基础
- 邻接矩阵存储有向图(详解)
- [快学Python3]二分查找[策略优化版本]
- 使用 zipfile 解压含有中文文件名的 zip 文件
- qsc oj 22 哗啦啦村的刁难(3)(随机数,神题)
- [快学Python3]数据结构与算法-二分查找
- [快学Python3]数据结构-队列
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python3.7调试的实例方法
- Laravel框架控制器,视图及模型操作图文详解
- PHP实现带进度条的Ajax文件上传功能示例
- 基于selenium及python实现下拉选项定位select
- PHP rmdir()函数的用法总结
- thinkphp5修改view到根目录实例方法
- openCV提取图像中的矩形区域
- PHP二维索引数组的遍历实例分析【2种方式】
- Selenium及python实现滚动操作多种方法
- PHP使用JPGRAPH制作圆柱图的方法详解
- PHP 实现超简单的SESSION与COOKIE登录验证功能示例
- PHP 图像处理与SESSION制作超简单验证码的方法示例
- 简述PHP7.4 新特性和废弃的功能
- laravel5.1框架下的批量赋值实现方法分析
- Laravel框架环境与配置操作实例分析