【LeetCode】至少有K个重复字符的最长子串Java题解
题目
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
代码
public class DayCode {
public static void main(String[] args) {
String s = "baaabcb";
int k = 3;
int ans = new DayCode().longestSubstring(s, k);
System.out.println("ans is " + ans);
}
/**
* https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/
* @param s
* @param k
* @return
*/
public int longestSubstring(String s, int k) {
if (s.length() < k) {
return 0;
}
HashMap counter = new HashMap<>(26);
for (int i = 0; i < s.length(); i++) {
counter.put(s.charAt(i), counter.getOrDefault(s.charAt(i), 0) + 1);
}
for (char c : counter.keySet()) {
if (counter.get(c) < k) {
int res = 0;
for (String t : s.split(String.valueOf(c))) {
res = Math.max(res, longestSubstring(t, k));
}
return res;
}
}
return s.length();
}
}
总结
这个题目不长,也容易懂,但是解决起来却不是那么简单。需要思考。
题目的核心是,对于字符串 s,如果存在某个字符 char,它的出现次数大于 0 且小于 k,则任何包含 char 的子串都不可能满足要求。
根据上述重要信息,就可以求解了。可以用滑动窗口来解决,也可以用递归来解决,相对而言,这里的递归代码更好写。
每日坚持一题,加油!