/*
* 分治递归
*/
class Solution {
public:
// 1.统计每个字符出现的次数
// 2.找到第一个出现次数小于k的字符,下标为i
// 3.处理该字符左边的字符串
// 4.在下标i后面找到第一个出现次数大于k的字符
//(思想:最长的子串一定不包含出现次数小于k的字符)
int longestSubstring(string s, int k) {
// 3种特殊情况的处理
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;
// 找到第一个出现次数小于k的字符的下标
while (i < s.size() && m[s[i]] >= k)
++ i;
if(i == s.size()) //当i等于数组的长度是,说明整个字符串满足条件
return s.size();
// 在该字符的左边继续找
int left = longestSubstring(s.substr(0,i),k);
// 在字符i的后面找到第一个出现次数大于等于k的字符
while(i<s.size() && m[s[i]] < k)
++i;
// substr(i):从i开始一直到末尾
int right = longestSubstring(s.substr(i),k);
return max(left,right);
}
};
LeetCode395. 至少有K个重复字符的最长子串 C++
最新推荐文章于 2023-01-19 12:23:32 发布