至少有 k 个重复字符的最长子串
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 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; } } };