• 【C语言刷LeetCode】395. 至少有 K 个重复字符的最长子串(M)


    给你一个字符串 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

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题有些意思,需要用到分治法

    计算所有字符的出现次数cnt[26];
    根据1<=cnt[i] 根据ch将字符串拆分, 递归处理拆分后的字符串;
    递归终止条件, 字符串中没有满足1<=cnt[i]

    1. int retmax;
    2. void Dfs(char *s, int l, int r, int k)
    3. {
    4. int i;
    5. int cnt[26] = {0};
    6. for (i = l; i <= r; i++) {
    7. cnt[s[i] - 'a']++;
    8. }
    9. char sqilt = 0;
    10. for (i = l; i <= r; i++) {
    11. if (cnt[s[i] - 'a'] < k && cnt[s[i] - 'a'] != 0) { // 这个字符出现次数小于k
    12. sqilt = s[i];
    13. break;
    14. }
    15. }
    16. if (sqilt == 0) { // 每一个字符出现次数都不少于k
    17. retmax = fmax(retmax, r - l + 1);
    18. return;
    19. }
    20. while (l <= r) {
    21. while (l <= r && s[l] == sqilt) { // 找第一个不等于sqilt的位置
    22. l++;
    23. }
    24. if (l > r) { // 这段字符里都是 sqilt,不可能有符合的字符串了
    25. return;
    26. }
    27. int start = l; // 记录这个位置
    28. while(l <= r && s[l] != sqilt) { // 找到第一个等于sqilt的位置
    29. l++;
    30. } // 这次while循环完,不用判断 l > r,因为最终都是要l-1
    31. Dfs(s, start, l - 1, k);
    32. l++;
    33. }
    34. }
    35. int longestSubstring(char * s, int k){
    36. int len = strlen(s);
    37. retmax = 0;
    38. Dfs(s, 0, len - 1, k);
    39. return retmax;
    40. }

  • 相关阅读:
    工程水文学复习资料
    基于STM32结合CubeMX学习Free-RT-OS的源码之事件集(event-group)
    VScode(1)之内网离线安装开发环境(VirtualBox+ubuntu+VScode)
    HTTPS 加密原理
    电商直播产业在成都直播基地加速成势 落地天府兴隆湖!
    查看linux系统情况常用命令
    C#WPF嵌套布局实例
    计算机毕业设计(附源码)python游戏盒子系统
    phpStudy下载(安装)-图文详解(windows)
    ASP.NET Core - 自定义中间件
  • 原文地址:https://blog.csdn.net/jin615567975/article/details/126615614