题目
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,则说明最终字符串不能包含该字符,将这些不能包含的字符作为分割字符串的依据,将字符串分为很多字符串,执行递归。
代码
class Solution {
public:
int maxlen = 0;
int longestSubstring(string s, int k) {
check(s,k);
return maxlen;
}
void check(string s, int k)
{
if(s.length() == 0)
return;
int t[26];
memset(t,0,sizeof(t));
for(int i = 0; i < s.length(); i ++)
{
t[s[i]-'a'] ++;
}
bool flag = true;
int g[26];
memset(g,0,sizeof(g));
for(int i = 0; i < 26; i ++)
{
if(t[i] < k && t[i] != 0)
{
flag = false;
g[i] = 1;
}
}
if(flag)
{
maxlen = max(maxlen, (int)s.length());
return;
}
string temps = "";
for(int j = 0; j < s.length(); j ++)
{
if(g[s[j]-'a'] == 0)
{
temps += s[j];
}
else
{
check(temps, k);
temps = "";
}
}
check(temps,k);
}
};