前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。这次比赛略无语,没想到前3题都可以用暴力解。
博客链接:mcf171的博客
——————————————————————————————
Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.
Example 1:
Input: s = "aaabb", k = 3 Output: 3 The longest substring is "aaa", as 'a' is repeated 3 times.
Example 2:
Input: s = "ababbc", k = 2 Output: 5 The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.
这个题目有点意思,如果字符串s满足条件了,返回s的长度,否则取一个不满足k的字符,根据这个字符去分割。Your runtime beats 78.69% of java submissions.
public class Solution {
public int longestSubstring(String s, int k) {
if (s.length() == 0 || k == 1) return s.length();
if (s.length() < k) return 0;
int[] count = new int[26];
for (char c : s.toCharArray()) count[c-'a'] ++;
boolean eligible = true;
for (int i = 0; i < 26; i ++) {
if (count[i] != 0 && count[i] < k) {eligible = false;break;}
}
if (eligible) return s.length();
char least = 0;
for (int i = 0; i < 26; i ++) {
if (count[i] != 0 && least == 0) {least = (char)(i+'a');continue;}
if (count[i]!=0 && count[i] < count[least - 'a']) least = (char)(i+'a');
}
String[] sub = s.split(least+"");
int res = 0;
for (String str : sub) {
res = Math.max(res, longestSubstring(str, k));
}
return res;
}
}