找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
代码如下:
class Solution {
public:
int longestSubstring(string s, int k) {
if(k<=1) return (int)s.length();
if(s.empty()||s.length()<k) return 0;
int *a=new int[26];
for(int i=0;i<26;i++) a[i]=0;
for(int i=0;i<s.length();i++) a[s[i]-'a']++;//统计每个字符串出现的次数
int ant=0;
while(ant<s.length()&&a[s[ant]-'a']>=k) ant++;//找到第一个不满足的字符位置
if(ant==s.length()) return s.length();//若全部满足,返回字符串长度
int L=longestSubstring(s.substr(0,ant),k);
while(ant<s.length()&&a[s[ant]-'a']<k) ant++;//继续寻找右边界
int R=longestSubstring(s.substr(ant),k);
delete[] a;
return max(L,R);
}
};