描述
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
分析
分治思想,把一个大问题切分成一个个小问题,解决了小问题就解决了大问题。
找到字符个数小于k的字符,用这个字符把字符串切分成几份,然后递归解决切分后的字符串,选择最大的返回结果。
找到字符个数小于k的字符只需要找到第一个就行,没必要用全部个数小于k的字符去切分,那样会重复判断相同的字符串,会超时。
class Solution {
public int longestSubstring(String s, int k) {
if (s.length() < k) {
return 0;
}
Map<Character,Integer> map = new HashMap<>();
for (char ch : s.toCharArray()) {
map.put(ch,map.getOrDefault(ch,0)+1);
}
for (char ch : map.keySet()) {
int ans = 0;
if (map.get(ch) < k) {
String[] str = s.split(""+ch);
for (String st : str) {
int tmp = longestSubstring(st,k);
ans = Math.max(tmp,ans);
}
return ans;
}
}
return s.length();
}
}