至少有K个重复字符的最长子串
/** * 分治 */ class Solution { // dp[i]:表示以i为结尾满足条件的子串的长度 public int longestSubstring(String s, int k) { int len = s.length(); return dfs(s, 0, len - 1, k); } public int dfs(String s, int l, int r, int k) { int[] c = new int[26]; for (int i = l; i <= r; i++) { c[s.charAt(i) - 'a'] ++; } // 找到第一个不满足条件的字母 char split = '0'; for (int i = 0; i < 26; i++) { if (c[i] > 0 && c[i] < k) { split = (char)(i + 'a'); break; } } // 说明s[l,r]满足题意 if (split == '0') { return r - l + 1; } int i = l; int res = 0; while (i <= r) { // 先找到第一个不等于split的下标 while (i <= r && s.charAt(i) == split) i++; if (i > r) break; int start = i; // 再找到第一个不等于split的下标 while (i <= r && s.charAt(i) != split) i++; // 分治 int len = dfs(s, start, i - 1, k); res = Math.max(res, len); } return res; } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通