题目链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/
题目描述
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
在真实的面试中遇到过这道题?
思路
1 分治递归
(1)遍历统计每个字符出现的次数
(2)将字符串以出现次数<k的字符分割为左右两个区间;问题就被拆分为对左子串、右子串求解这两个子问题。
复杂度分析
时间复杂度:O(nlogn)
空间复杂度:O(logn)
/*
* 分治递归
*/
class Solution {
public:
int longestSubstring(string s, int k) {
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;
while (i < s.size() && m[s[i]] >= k)
++ i;
if(i == s.size()) return s.size();
int left = longestSubstring(s.substr(0,i),k);
while(i<s.size() && m[s[i]] < k)
++i;
int right = longestSubstring(s.substr(i),k);
return max(left,right);
}
};