395.至少有 K 个重复字符的最长子串
题目
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k 。返回这一子串的长度。
示例 1:
输入:s = "aaabb", k = 3
输出:3
解释:最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:s = "ababbc", k = 2
输出:5
解释:最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次
暴力法+Mask
暴力法的思路是遍历每一个子串,检测子串是否每个字符出现次数都不小于k,而检测需要遍历hashmap。在暴力法的基础上,我们使用mask实现O(1)时间检测子串是否每个字符出现次数都不小于k,从而降低时间复杂度。方法是定义一个int型的mask,int有32位,可用低26位对应每一个小写字母,数位为1表示该位对应字符出现次数没有达到k次,为0则表示出现次数大于等于k。这样只要mask==0即可说明对应子串每个字符出现次数都不小于k次。
public int longestSubstring(String s, int k) {
int i=0,n=s.length(),maxLen=0;
//遍历每一个子串[i,j]
while(i<=n-k){
//记录子串[i,j]每个字符出现的次数
int[] charCount=new int[26];
int mask=0,idx=i;
for(int j=i;j<n;++j){
int t=s.charAt(j)-'a';
charCount[t]++;
//mask第t位置为0
if(charCount[t]>=k) mask&=(~(1<<t));
//mask第t位置为1
else mask|=(1<<t);
if(mask==0&&j-i+1>maxLen){
maxLen=j-i+1;
idx=j;
}
}
i=idx+1;
}
return maxLen;
}
滑动窗口法
子串不同字符数的范围在1-26,枚举子串不同字符数,维护一个窗口保持每一次窗口内不同字符数不变。
public int longestSubstring(String s, int k) {
int maxLen=0,n=s.length();
for(int cnt=1;cnt<=26;++cnt){
//uniqueCnt记录窗口内不同字符数
int left=0,right=0,uniqueCnt=0;
//记录窗口内每个字符出现的次数
int[] charCount=new int[26];
while(right<n){
boolean valid=true;
//当窗口内不同字符数大于cnt时,窗口左指针不断右移,知道不同字符数等于cnt
//同时注意窗口左指针右移时charCount会有改变
while(uniqueCnt>cnt){
if(--charCount[s.charAt(left++)-'a']==0) uniqueCnt--;
}
if(charCount[s.charAt(right++)-'a']++==0) uniqueCnt++;
//对于每一个窗口,遍历charCount判断窗口内字符串是否每个字符出现次数都不小于k
for(int i=0;i<26;++i){
if(charCount[i]>0&&charCount[i]<k) {valid=false;break;}
}
if(valid&&maxLen<right-left) maxLen=right-left;
}
}
return maxLen;
}
分治法
为了寻找符合条件的子串,那么字符串s中出现次数小于k的字符则不能包含在内,因此这些不符合条件的字符就相当于是分隔符,将字符串切分成了好多了字串,而对于每个字串,我们想在其中寻找到最长的符合要求的子串,因此这就是求原问题的子问题,很明显可以用分治算法。当s所有字符出现次数都不小于k或s为空串时递归结束。
public int longestSubstring(String s, int k) {
int res=0,n=s.length();
int[] charCount=new int[26];
for(int i=0;i<n;++i) charCount[s.charAt(i)-'a']++;
boolean valid=true;
for(int i=0;i<n;++i){
if(charCount[s.charAt(i)-'a']<k){
valid=false;
int l1=longestSubstring(s.substring(0,i),k);
int l2=longestSubstring(s.substring(i+1),k);
res=Math.max(l1,l2);
break;
}
}
//valid为true说明s每个字符出现次数都不小于k或s为空串,此时返回它的长度n即可
return valid?n:res;
}
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 输 ...
- 图解leetcode —— 395. 至少有K个重复字符的最长子串
前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不 ...
- 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--003--无重复字符的最长子串
问题描述: 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc" ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- leetcode刷题3.无重复字符的最长子串
题目:给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...
随机推荐
- Defence
emm...这道题我调了一下午你敢信?? 好吧还是我太天真了. 开始的时候以为自己线段树动态开点与合并写错了,就调; 结果发现没问题,那就是信息维护错了. 一开始以为自己最左右的1 ...
- 区间DP的瞎扯淡
写在前面连个引言都不加就直接开1. 区间DP状态常见模板: f[i][j]常常表示第i个到第j个这个区间内达到题目要求,所需要的最小值(最大值) 如: 1. [石子合并](https://www.lu ...
- 前后端数据交互(八)——请求方法 GET 和 POST 区别
WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...
- WPF Prism8.0中注册Nlog日志服务
无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来 ...
- (9)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-搭建Eureka服务注册中心
首先创建一个 Maven 项目,取名为 eureka-server,在 pom.xml 中配置 Eureka 的依赖信息,代码如下所示. <!-- Spring Boot --> &l ...
- Php实现简易购物商城系统
实现功能: 1.系统功能模块包括: 1)登陆注册模块 包括验证码.找回密码.注册模块中要使用Ajax判断用户名是否已经存在,使用正则表达式判断电子邮件.手机号和用户密码的格式是否合法. 2)用户管理模 ...
- Spring Cloud Hystrix 学习(二)熔断与降级
今天来看下Hystrix的熔断与降级. 首先什么是降级?当请求超时.资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条 ...
- qt5 打包exe执行文件
1.pyinstaller 安装 :pip install pyinstaller 执行:pyinstaller -F -w --icon=logo.ico xx.py 打包后的文件 在 dist 下 ...
- 鸿蒙内核源码分析(索引节点篇) | 谁是文件系统最重要的概念 | 百篇博客分析OpenHarmony源码 | v64.01
百篇博客系列篇.本篇为: v64.xx 鸿蒙内核源码分析(索引节点篇) | 谁是文件系统最重要的概念 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么 ...
- P4780-Phi的反函数【dfs】
正题 题目链接:https://www.luogu.com.cn/problem/P4780 题目大意 给出\(n\),求一个最小的\(x\)满足\(\varphi(x)=n\). 若不存在或者大于\ ...