题目要求

本题共有两个要求

  1. 符合要求的字符串中每一个字符出现的次数都要大于等于给与的数字K
  2. 最终返回结果的是符合要求的字符串中最长的字符串长度

算法思想

hash_map + 递归 + 分治

  1. 使用数组 char_map 记录每个字符在字符串中出现的次数(目的是,在遍历字符串 s 的过程中,字符出现次数 N < K,就是分治的锚点)
  2. 遍历字符串 s ,若字符 s[i]char_map 中记录次数大于等于 K,则将 s[i] 添加到当前子串 word 中,并且,记录现在子串 word 的长度
  3. 但是在遍历的过程中,字符 s[i] 小于 K ,就要分析前面的子串 word 中每次都出现的字符是否符号大于等于 K 这一条件
  4. 首先,在某个字符处断,之前的子串 word 作为一个独立的子串,其中的字符需要从字符串 s 中减去
  5. 之后子串 word 作为一个独立的字符串,就要使用递归,对 word 中字符做判断,返回符合要求的子串长度
  6. 此时,就不需要子串 word ,字符串 s 继续遍历,word 要用来储存之后的子串,所以在完成递归后需要将子串重置
  7. 按要求2,需要获得最长的符合要求的子串长度,所以,得到的子串长度与保存的之前最长字符串长度比较,若新得到的子串长度大于老的子串长度,就更新最长子串长度,同时 tmp 是遇到断点前记录的长度,不适用于新的子串了,所以要重置 tmp
  8. 如果至字符串 s 末尾,还有一个字符串都符合条件,但没有断点了也就不需要进入17行else中判断那个子串更长了,所以需要在for循环外面创建创建比较
  9. 至此完成算法设计

图解示例

完整代码

class Solution {
public:int longestSubstring(string s, int k) {if(s.size() < k) return 0;int ans = 0;int tmp = 0;// 记录有多少字符数小于k的 int char_map[128] = {0};string word = "";for(int i = 0; i < s.size(); i++) {char_map[s[i]]++;}for(int i = 0; i < s.size(); i++) {if(char_map[s[i]]>=k) {word += s[i];tmp++;} else if(char_map[s[i]]>=k){for(int j = 0; j < word.size(); j++) {char_map[word[j]]--;}tmp = longestSubstring(word, k);word = "";if(ans<tmp) {ans = tmp;}tmp = 0;}}if(ans<tmp) {ans = tmp;}return ans;}
};

提交结果


若有其他解法,欢迎评论区补充。

【LeetCode】0395.至少有K个重复字符的最长子串相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  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. Tensor VS NumPy
  2. yum chrome
  3. 转型会员制,云集能否讲好电商下半场故事?
  4. 毕业设计matlab在误差处理中的应用,毕业设计MATLAB在误差处理中的应用要点分析.doc...
  5. Python小白的数学建模课-22.插值方法
  6. plsql删除大量数据_一次oracle大量数据删除经历
  7. 五项技术创新 创造未来出行新体验
  8. 解决npm npm does not support Node.js
  9. Java-虚拟机-终结方法finalize
  10. C语言学习笔记--函数
  11. 易门一中2021年高考成绩查询,附属易门中学2021届高二年级教师参加“中国高考评价体系下的2021年一轮备考策略”直播会...
  12. 更换tomcat 地址栏图标
  13. 确定有限状态自动机(deterministic finite automaton --> DFA)
  14. libsvm警告: WARNING: reaching max number of iterations 解决办法
  15. Python快速读取超大文件
  16. 最详细的虚拟机安装教程
  17. python程序设计山东联盟期末考试_知到_Python程序设计基础(山东联盟)_章节测试答案...
  18. Android q索尼手机相机算法,手机厂商套路太多!竟在手机摄像头上玩“掩眼法”?...
  19. php5 dm.dll,win10模块dll加载失败二进制怎么解决?
  20. 网络流问题以及EK算法复杂度分析

热门文章

  1. JS模块化写法(转)
  2. Beginning C# Objects 读书笔记(一)
  3. 波卡链Substrate (7)Grandpa + Babe
  4. 百度超级链XChain(12)平行链与群组
  5. [密码学] RSA利用解密指数分解n
  6. Kubernetes 中创建 Pod 时集群中到底发生了些什么?
  7. 【django】配置URLconf
  8. Linux Kernel aarch64 Crypto原理和框架介绍
  9. 使用docker-compose部署sentinel
  10. (67)多核同步,lock 总线锁 ,自己实现临界区