题目——对所有字符出现频率进行大于等于k的限制
思路
- 递归实现分割
- 利用计数小于k的字母进行分割
- 利用段需要大于k且大于当前res 来过滤小段
代码
步骤:
1. 全体计数
2. 根据计数与k的关系进行小于k的统计
3. 判断是否需要分割——无需分割返回整个字符串
4. 需要分割——循环、递归查找最大值
5. 对于最后一段进行考虑——当最后一个元素计数大于k时 该段会被遗弃
class Solution {
public:
int longestSubstring(string s, int k) {
unordered_map<char, int> m;
for (auto& c : s)
++m[c];
vector<int> splits;
int n = s.size();
for (int i = 0; i < n; ++i)
if (m[s[i]] < k)
splits.push_back(i);
if (splits.size() <= 0)
return s.size();
int res = 0;
int left = 0;
for (int i = 0; i < splits.size(); ++i){
int len = splits[i] - left;
if (len >= k && len > res)
res = max(res, longestSubstring(s.substr(left, len), k));
left = splits[i] + 1;
}
if (left < n-1)
res = max(res, longestSubstring(s.substr(left, n-1-left+1), k));
return res;
}
};