395. 至少有K个重复字符的最长子串
参考题解:https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/solutions/623991/jie-ben-ti-bang-zhu-da-jia-li-jie-di-gui-obla
- 递归含义:返回字符串
s
中至少有k
个重复字符的最长子串 - 递归终止条件:当
s
的长度小于k
,终止 - 递归条件:当
s
中的某个字符c
的数量小于k
,则包含c
的子串必然不符合条件,因此根据字符c
对字符串s
进行切分,得到若干个字符串t
,对t
递归进行上述检查。 - 递归条件外:指没进入递归条件,即
s
中所有字符的数量都大于等于k
,因此符合条件的最长子串就是s
本身。
class Solution {
public int longestSubstring(String s, int k) {
int n = s.length();
if (n < k) return 0;
Map<Character, Integer> counter = new HashMap<>();
for (int i = 0; i < n; ++i) {
counter.put(s.charAt(i), counter.getOrDefault(s.charAt(i), 0) + 1);
}
for (char c : counter.keySet()) {
if (counter.get(c) < k) {
int ans = 0;
for (String t : s.split(String.valueOf(c))) {
ans = Math.max(ans, longestSubstring(t, k));
}
return ans;
}
}
return n;
}
}