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.
分析:
首先统计每个字母出现的次数,若该词出现的次数大于0且小于k的话,则其肯定不在最后的字符串中,即最大串出现在其左边或是右边。因此可以将问题分成2个子问题。
public class Solution {
public int longestSubstring(String s, int k) {
int n=s.length();
return subHelp(s,k,0,n-1);
}
public int subHelp(String s,int k,int start,int end){
int n=end-start+1;
if(n<k)
return 0;
int[] alpha=new int[26];
for(int i=start;i<=end;i++){
alpha[s.charAt(i)-'a']++;
}
int max=0,index;
int max1=0,max2=0;
for(int i=0;i<26;i++){
if(alpha[i]>0&&alpha[i]<k){
index=s.indexOf(i+'a',start);
if((index-1)>start)
max1=subHelp(s,k,start,index-1);
if((index+1)<end)
max2=subHelp(s,k,index+1,end);
max=max1>max2?max1:max2;
return max;
}
}
return n;
}
}