395. 至少有 K 个重复字符的最长子串 分治法 递归, 最简单了,半小时可以搞定。

class Solution {
public:
    int longestSubstring(string s, int k) {
        return dfs(s,k);
    }
    int dfs(string s,int k ){ //求字符串中最长的每个字符都不少k的子串长度
        int cnt[26] = {0};
        for(int i = 0;i < s.size();i++){ //统计每个字符出现的次数
            cnt[s[i]-'a']++;
        }
        char split = 0;
        for(int i = 0; i < 26 ; i++){
            if(cnt[i] && cnt[i] < k){ // 如果某个字符出现的次数少于k,那么记录下该字符
                split = i + 'a';
                break;
            }
        }
        //如果没有出现次数小于k的字符,那么该字符串是满足条件的子串,返回其长度
        if(!split) return s.size();

        //如果出现了次数小于k的字符,那么以该字符将母串分割为不同的部分,对不同的部分进行递归求母问题, 对分割的不同部分比较求出来的最长子串长度是多少。
        int left = 0, right = 0;
        int lgs_length = 0;
        while((right = s.find(split,left)) != string::npos){
            int tmp = dfs(s.substr(left,right - left),k);
            if(tmp > lgs_length) lgs_length = tmp;
            left = right + 1;
        }
        // 没有被分割的最后一部分子串,求最长子串长度
        int tmp = dfs(s.substr(left,right - left),k);
        if(tmp > lgs_length) lgs_length = tmp;
        return lgs_length;
    }
};
posted @   danieldai  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2017-12-25 web-based installer and executable installer in python 3 ,what is the difference between them?
点击右上角即可分享
微信分享提示