找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:递归解决
l : 代表子串的起始位置;r : 代表子串的终止位置
s………………………………………………………g………………………………………………………e
l g字符在s - e的子串中出现的次数 < k r
* 从起始和终止位置开始进行删除不满足条件的字符(不满足条件:在s - e的子串中出现的次数 < k)
* 从g字符的位置将字符串切开,再次重复以上步骤
class Solution {
public:
int dfs(string str,int len,int l,int r,int k){
if(r-l+1 < k) return 0;
vector<int>vect;
for(int i=0;i<27;i++) vect.push_back(0);
for(int i=l;i<=r;i++) vect[str[i]-'a']++; //统计在子串中每个字符出现的次数
while(r-l+1 >= k && vect[str[r]-'a']<k) r--; //从终止位置开始删除不符合条件的字符
while(r-l+1 >= k && vect[str[l]-'a']<k) l++; //从起始位置开始删除不符合条件的字符
if(r-l+1 < k) return 0; //删除完不符合条件
for(int i=l+1;i<r;i++){
if(vect[str[i]-'a'] < k){
return max(dfs(str,len,l,i-1,k),dfs(str,len,i+1,r,k)); //从某处不符合的位置断开分情况处理
}
}
return r-l+1;
}
int longestSubstring(string s, int k) {
int len=s.length();
if(!len) return 0;
if(k <= 1) return len;
return dfs(s,len,0,len-1,k);
}
};