1. 至少有 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 次。

提示:

1 <= s.length <= 104
s 仅由小写英文字母组成
1 <= k <= 105

题解

很有趣的题目,我们循环从左到右遍历一遍,于是乎,针对当前位置i,我们在区间[i,s.length()]之间找一个位置pos,这个位置pos满足26个字母,在区间[i,pos]内要么没出现过,要么出现次数大于等于k,于是我们可以单独对每个字母进行前缀和,最后用二分查找去优化速度,先单独去找每个字母的这个pos,那么针对每个字母,要么在区间[i,s.length()]内出现次数大于等于k,那么就是小于k,针对小于k这种情况,只能让这个字母不要出现,于是又要二分一次,去找这个finl位置,使得在区间[i,finl]内该字母没出现过。

于是乎我们针对26个字母,每个字母找两个位置finl,finr,使得
在区间[i,finl]内该字母没出现过,在区间[i,finr]内该字母出现次数恰好为k。

如果某个字母找不到这样的finr,那么只能把这个字母剔除,于是当前区间更新为[i,finl],那么同样的,如果其他的字母的finr是大于当前这个字母的finl,说明会导致其他的字母在区间[i,finl]内是不会出现k次的,于是其他字母也只能删除,更新为其他字母和当前的该字母的finl比较小,看谁小。不断这样的更新区间,为了保证其他字母的finr可以有效被比较到,要使用优先队列,把finr大的排前面先比较,不然容易出现这样的情况。

pos=5

字符’a’,finl=0,finr=5;
字符’b’,finl=1,finr=7;

如果先拿pos和字符’a’的比较,那么不会被更新,pos还是为5,再和字符’b’比较,结果更新答案为pos=1,这样明显不对。

因为当前的pos应该为0,所以说要先把finr大的字母放前面考虑。

AC代码

class Solution {public:struct Node{int l,r;friend bool operator < (Node a, Node b){return a.r < b.r;//x大的优先}};int sum[10010][26];priority_queue<Node>q;int longestSubstring(string s, int k) {memset(sum,0,sizeof(sum));for(int i=0;i<s.length();i++){for(int j=0;j<26;j++){sum[i+1][j]=sum[i][j]+(s[i]-'a'==j?1:0);}}int res=0;for(int i=1;i<=s.length();i++){bool flag=true;int pos=s.length();for(int j=0;j<26;j++){if(sum[s.length()][j]-sum[i-1][j]==0)//该字符在[i,s.length()]区间不存在,不用考虑continue;int L=i-1,R=s.length(),finr=-1;while(L<=R){int mid=(L+R)/2;if(sum[mid][j]-sum[i-1][j]>=k)//找每个字母出现次数满足大于等于k的位置{R=mid-1;finr=mid;}else L=mid+1;}L=i-1,R=s.length();int finl=-1;while(L<=R){int mid=(L+R)/2;if(sum[mid][j]-sum[i-1][j]<=0)//找到该字符没有出现的位置{L=mid+1;finl=mid;}else R=mid-1;}//cout<<i<<" "<<j<<" "<<finl<<" "<<finr<<endl;if(finr==-1)//说明没找到,那么当前的区间不能包含字母j{pos=min(pos,finl);//当前区间只能小于finl,使得当前的区间不会出现字符jflag=false;//说明当前区间有问题,需要舍去某个字符}else{//没啥问题,把找到的位置储存进去Node t;t.l=finl,t.r=finr;q.push(t);}}if(flag)//没啥问题res=max(res,int(s.length()-i+1));else{while(q.size()>0){if(pos<q.top().r)pos=min(pos,q.top().l);q.pop();}if(pos<i)continue;//cout<<pos<<endl;//最后所有的字符都满足要求res=max(res,pos-i+1);}}return res;}
};

LeetCode 395. 至少有 K 个重复字符的最长子串--二分查找+前缀和+优先队列相关推荐

  1. LeetCode 395. 至少有K个重复字符的最长子串(分治)

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

  2. leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)

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

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

    395. 至少有K个重复字符的最长子串 Ideas 一开始想到的是sliding window,但是它要求的是最长子串,不太好写. [参考大佬的题解:借本题帮助大家理解递归] 求子串问题除了用双指针还 ...

  4. leetcode 395. Longest Substring with At Least K Repeating Characters| 395. 至少有 K 个重复字符的最长子串(分治法)

    题目 https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/ 题解 参考:官方题解 ...

  5. 【LeetCode】0395.至少有K个重复字符的最长子串

    题目要求 本题共有两个要求 符合要求的字符串中每一个字符出现的次数都要大于等于给与的数字K 最终返回结果的是符合要求的字符串中最长的字符串长度 算法思想 hash_map + 递归 + 分治 使用数组 ...

  6. 算法---------至少有K个重复字符的最长子串(Java版本)

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

  7. LeetCode 每日一题 3. 无重复字符的最长子串

    LeetCode 每日一题 3. 无重复字符的最长子串   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创 ...

  8. LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...

  9. python【力扣LeetCode算法题库】3- 无重复字符的最长子串

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

最新文章

  1. 1小时教你做360度全景“小星球”效果图 Skillshare – Create a Panoramic ‘Little Planet’ from Anywhere
  2. Jquery--遮罩弹窗特效
  3. ubuntu 安装opencl失败笔记
  4. YunYang1994/tensorflow-yolov3 Readme 翻译
  5. HDFS的API调用,创建Maven工程,创建一个非Maven工程,HDFS客户端操作数据代码示例,文件方式操作和流式操作
  6. linux常用命令和选项
  7. java string对象创建对象_Java String 创建了几个对象
  8. Oracle数据库ORA-12514错误的解决办法
  9. 解析Excel_Poi
  10. springboot2.x 集成百度 uidgenerator
  11. 魔兽世界稳定服务器,魔兽世界美服服务器趋于稳定 排队新技术将实装
  12. ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
  13. Photoshop 颜色理论(转)
  14. 程序员被老板要求两个月做个app, 要不比京东差,网友:辞职吧
  15. oracle revoke 列_oracle受权与回收权限grant和revoke
  16. 这两天火爆全网的「蚂蚁呀嘿」App,被下架了...
  17. 华为华三常用display命令
  18. 农业灌溉水力驱动过滤器
  19. 湖北计算机二级考试时间安排,湖北3月计算机二级考试时间安排
  20. ssh: Bad configuration option: usedns

热门文章

  1. python写个消消乐小游戏
  2. A. 阿里巴巴 数据中台 --- 建设之路
  3. 单片机12864电子锁c语言代码,51单片机+LCD12864实现密码锁Proteus仿真和代码
  4. 微店API分享:获得微店商品详情 API 返回值说明
  5. ASP.Net 自定义行数,可读取填入数据的页面表格
  6. 计算机office考试题型,计算机二级考试office题型有哪些
  7. android surface用法,Android SurfaceView的基本使用
  8. 运维需要懂产品和运营吗
  9. 阿里巴巴校园招聘 —— 灵犀游戏开发测试岗笔试题目总结(菜鸡版解析)涉及知识点——十字链表、线程与堆栈、FTP、Telnet、红黑树、哈夫曼树、平衡二叉树、乐观锁、悲观锁、HTTP、NIM游戏
  10. c++语言const是什么意思,c++中const关键字