至少有 k 个重复字符的最长子串

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

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

最长子串为 "aaa" ,其中 'a' 重复了 3 次。

示例 2:

输入:
s = "ababbc", k = 2

输出:
5

最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

 

首先遍历原字符串统计每个字符出现的次数,并保存在一个新的对象中;

然后遍历该对象,找到出现次数少于 k 的字符,并根据该字符分割原字符串,再分析子字符串

 

var longestSubstring = function(s, k) {
    return recursive(s,k);
    function recursive(s,k){
        if(s.length==0 || s.length<k){
            return 0;
        }
        let countNum = {};
        //遍历字符串,统计每个字符出现的个数
        for(let i=0;i<s.length;i++){
            if(!countNum[s[i]]){
                countNum[s[i]] = 1;
            }else{
                countNum[s[i]]++;
            }
        }
        //遍历countNum,找到出现个数少于 k 的字符
        let incorrectStr = [];
        for(let str in countNum){
            if(countNum[str]<k){
                incorrectStr.push(str);
            }
        }
        //如果字符个数都大于 k 
        if (incorrectStr.length == 0) {
                return s.length;
        } else {
            var split = s.split(new RegExp(incorrectStr.join('|')));
            var max = 0;
            for(var i of split){
                var len = recursive(i,k);
                max = (len>max)? len : max;
            }
            return max;
        }
    }
};

 

 

 


posted @ 2019-07-19 15:05  湛蓝的家  阅读(248)  评论(0编辑  收藏  举报