题目

给你一个字符串 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 个重复字符的最长子串

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. 图解leetcode —— 395. 至少有K个重复字符的最长子串

    前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不 ...

  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--003--无重复字符的最长子串

    问题描述: 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc" ...

  8. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  9. leetcode刷题3.无重复字符的最长子串

    题目:给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

随机推荐

  1. 【Azure 应用服务】Python flask 应用部署在Aure App Service中作为一个子项目时,解决遇见的404 Not Found问题

    问题描述 在成功的部署Python flask应用到App Service (Windows)后,如果需要把当前项目(如:hiflask)作为一个子项目(子站点),把web.config文件从wwwr ...

  2. Python习题集(十一)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 如果一个正整数等于 ...

  3. 【第六篇】- Maven 仓库之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 仓库 在 Maven 的术语中,仓库是一个位置(place). Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库. 在 Maven 中,任何一个依赖.插件或者项目构建的输出 ...

  4. Linux目录同步到阿里云OSS工具ossutil

    Linux目录同步到阿里云OSS工具ossutil 背景 ​ 最近公司服务用户激增,常规文件服务器不能满足需求,严重影响性能,决定将静态文件迁移到阿里云OSS,用来解决性能问题,提高用户体验.毕竟之前 ...

  5. DP之背包经典三例

    0/1背包 HDU2602 01背包(ZeroOnePack): 有N件物品和一个容量为V的背包,每种物品均只有一件.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大 ...

  6. js设计模式之发布订阅模式

    1. 定义 发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知. 订阅者(Subscriber)把自己想订阅的事件注册(Subscri ...

  7. Docker入门系列之一:什么是Docker?

    原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-b7ba70caeb4b 翻译: ...

  8. 在PHP中操作文件的扩展属性

    在操作系统的文件中,还存在着一种我们可以自己定义的文件属性.这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容.它们可以将一个键值对信息永久得关联到文件上,一般现在的 Li ...

  9. Faster RCNN 改进论文及资料

    1,面向小目标的多尺度Faster RCNN检测算法 黄继鹏等 对高分辨率图像进行下采样和上采样,使得网上获取的数据与实际测试数据分布接近. 下采样:最大池化和平均池化 上采样:线性插值,区域插值,最 ...

  10. stmt.executeQuery不执行解决办法

    感谢博主分享:https://blog.csdn.net/lxmky/article/details/4705698 今天在Eclipse下编写jsp网页时,出现一个问题,主要是stmt.execut ...