题目描述:
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次的字符不能出现在子字符串中,所以要以它分隔符将字符串拆分为多段字符串,然后利用递归依次求最长子字符串。
class Solution {
public:
int longestSubstring(string s, int k) {
if(s.size()==0) return 0;
unordered_map<char,int> hash;
for(int i=0;i<s.size();i++)
{
if(hash.count(s[i])==0) hash[s[i]]=1;
else hash[s[i]]++;
}
char c='#';
unordered_map<char,int>::iterator it;
for(it=hash.begin();it!=hash.end();it++)
{
if((*it).second<k)
{
c=(*it).first;
break;
}
}
if(c=='#') return s.size();
istringstream iss(s);
string temp;
vector<string> v;
while(getline(iss,temp,c)) v.push_back(temp);
int max_length=0;
for(int i=0;i<v.size();i++)
max_length=max(max_length,longestSubstring(v[i],k));
return max_length;
}
};