LeetCode395. 至少有K个重复字符的最长子串 C++

/*
 * 分治递归
 */
class Solution {
public:
    // 1.统计每个字符出现的次数
    // 2.找到第一个出现次数小于k的字符,下标为i
    // 3.处理该字符左边的字符串
    // 4.在下标i后面找到第一个出现次数大于k的字符
    //(思想:最长的子串一定不包含出现次数小于k的字符)
    int longestSubstring(string s, int k) {
        // 3种特殊情况的处理
        if (s.empty() || s.size() < k ) 
            return 0;
        if (k <=1) 
            return s.size();

        unordered_map<char, int> m;
        // 统计每个字符出现的次数
        for (char c:s)
            m[c] ++;

        int i = 0;
        // 找到第一个出现次数小于k的字符的下标
        while (i < s.size() && m[s[i]] >= k)
            ++ i;
        if(i == s.size()) //当i等于数组的长度是,说明整个字符串满足条件
            return s.size();

        // 在该字符的左边继续找
        int left = longestSubstring(s.substr(0,i),k);
        // 在字符i的后面找到第一个出现次数大于等于k的字符
        while(i<s.size() && m[s[i]] < k)
            ++i;
        // substr(i):从i开始一直到末尾
        int right = longestSubstring(s.substr(i),k);

        return max(left,right);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值