LeetCode 395 至少有K个重复字符的最长子串 HERODING的LeetCode之路

找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。

示例 1:

输入:
s = “aaabb”, k = 3

输出:
3

最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。

示例 2:

输入:
s = “ababbc”, k = 2

输出:
5

最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。

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

解题思路:
分治思想作为递归的一种方式,最大的优势就是利于理解,我们要明白一个道理,就是满足条件的字符串之中一定没有个数小于k的元素,所以当遇到不满足条件的字符,以它为轴进行切割即可,代码如下:

class Solution {
    
    
public:
    int longestSubstring(string s, int k) {
    
    
        // 如果出现k不满足1返回s的长度
        if (k <= 1) return s.size();
        // 如果s的长度不足k或者s为空返回0
        if(s.size() < k || s.empty()) return 0;

        // 定义存储字符ASCII的数组,统计各个字符的数量
        vector<int> hash(128, 0);
        for (char c : s) ++hash[c];
        
        // 切割字符串中字符都满足大于等于k条件的字符串
        int index = 0;
        while (index < s.size() && hash[s[index]] >= k) ++index;
        if (index == s.size()) return s.size();

        // 左边满足
        int l = longestSubstring(s.substr(0, index), k);
        while (index < s.size() && hash[s[index]] < k) ++index;
        // 右边满足
        int r = longestSubstring(s.substr(index), k);
        
        return max(l, r);
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/solution/cfen-zhi-si-lu-by-heroding-mu1f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/114159511
今日推荐