题目:
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.
思路:
这道题目必须用一下递归,并且不能用全局哈希表(我刚开始就栽在这个全局哈希表上面了,是因为自己对题意的理解不对)。分为四个步骤:1)统计每个字母出现的次数;2)找出不合法的字符(也就是在本字符串中出现次数不够K的字符);3)如果没有任何不合法的字符,那么返回字符串的长度;4)如果有不合法的字符,那么将这个字符串从第一个不合法的字符串切开,然后递归执行,最后返回两个递归函数返回值的最大值。
代码:
class Solution {
public:
int longestSubstring(string s, int k) {
if(s.size() == 0 || k > s.size()) {
return 0;
}
if(k == 0) {
return s.size();
}
vector<int> hash(26, 0);
for(int i = 0; i < s.size(); i++){
++hash[s[i] - 'a'];
}
int index = 0;
while(index < s.size() && hash[s[index] - 'a'] >= k) {
++index;
}
if(index == s.size()) {
return s.size();
}
int left = longestSubstring(s.substr(0 , index) , k);
int right = longestSubstring(s.substr(index + 1) , k);
return max(left, right);
}
};