395. Longest Substring with At least K Repeating Characters
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.
算法分析
先統計出字符串中每個字符出現的次數,對於出現次數少於k的字符,任何一個包含該字符的字符串都不是符合要求的子串,因此這樣的字符就是分隔符,應該以這些出現次數少於k次的字符做分隔符打斷原字符串,然后對各個打斷得到的字符串進行遞歸統計,得到最長的符合要求的字符串。如果一個字符串中不包含分隔符(即每個字符出現的次數都達到了k次及以上次數),那么這個字符串就是符合要求的子串。
Java 算法實現:
public class Solution {
public int longestSubstring(String s, int k) {
if(k<=1){
return s.length();
}
int[] repeat=new int['z'+1];
for(int i=0;i<s.length();i++){
repeat[s.charAt(i)]++;
}
StringBuilder regex=new StringBuilder("");
boolean firstSplit=true;
for(int i='a';i<='z';i++){
if(repeat[i]>0&&repeat[i]<k){
if(firstSplit){
regex.append((char)i);
firstSplit=false;
}
else{
regex.append("|"+(char)i);
}
}
}
if(regex.length()>0){
//說明有分隔符
String[] strs=s.split(regex.toString());
int max=0;
int tmpAns=0;
for(String str:strs){
tmpAns=longestSubstring(str, k);
if(tmpAns>max){
max=tmpAns;
}
}
return max;
}
else{
//沒有分隔符,說明s中的每一個字符出現的次數都大於等於k
return s.length();
}
}
}