- 分治算法
class Solution {
// 分治算法
public int longestSubstring(String s, int k) {
// 如果string的长度小于k,那么必不包含重复出现k次及以上的字母
if(s.length() < k) return 0;
// 记录每个字母出现的次数
HashMap<Character, Integer> charCount = new HashMap<>();
for(int i = 0; i < s.length(); i++){
charCount.put(s.charAt(i), charCount.getOrDefault(s.charAt(i), 0) + 1);
}
for (Character c : charCount.keySet()) {
// 如果字符串中有字母的出现次数小于k,
// 那么符合条件的substring必不包含该字母,
// 所以就在不包含该字母的substring继续找符合条件的substring,
// 返回它们的长度
if(charCount.get(c) < k){
int res = 0; //符合条件的字符串的长度
for (String s1 : s.split(String.valueOf(c))) {
res = Math.max(res, longestSubstring(s1, k));
}
return res;
}
}
// 一个完整的string或者substring符合条件,
// 它就不会进入if(charCount.get(c) < k)语句,
// 所以可以直接返回它的长度
return s.length();
}
}