395. 至少有 K 个重复字符的最长子串 分治法 递归, 最简单了,半小时可以搞定。
class Solution {
public:
int longestSubstring(string s, int k) {
return dfs(s,k);
}
int dfs(string s,int k ){ //求字符串中最长的每个字符都不少k的子串长度
int cnt[26] = {0};
for(int i = 0;i < s.size();i++){ //统计每个字符出现的次数
cnt[s[i]-'a']++;
}
char split = 0;
for(int i = 0; i < 26 ; i++){
if(cnt[i] && cnt[i] < k){ // 如果某个字符出现的次数少于k,那么记录下该字符
split = i + 'a';
break;
}
}
//如果没有出现次数小于k的字符,那么该字符串是满足条件的子串,返回其长度
if(!split) return s.size();
//如果出现了次数小于k的字符,那么以该字符将母串分割为不同的部分,对不同的部分进行递归求母问题, 对分割的不同部分比较求出来的最长子串长度是多少。
int left = 0, right = 0;
int lgs_length = 0;
while((right = s.find(split,left)) != string::npos){
int tmp = dfs(s.substr(left,right - left),k);
if(tmp > lgs_length) lgs_length = tmp;
left = right + 1;
}
// 没有被分割的最后一部分子串,求最长子串长度
int tmp = dfs(s.substr(left,right - left),k);
if(tmp > lgs_length) lgs_length = tmp;
return lgs_length;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2017-12-25 web-based installer and executable installer in python 3 ,what is the difference between them?