找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
思路分析:使用两个指针left、right,和小写字母计数器统计字符段中各个字符出现的次数,然后调整当前的left、right指针。再遍历一遍修正后的字符段,如果中间有出现次数小于k的字符,那么将修正后的字符段拆开为[left, index - 1]和[index + 1, right]两个字符段重新寻找。
class Solution {
public:
int longestSubstring(string s, int k) {
return myHelper(s, k, 0, s.size() - 1);//left == 0, right = s.size() - 1
}
//寻找s串中[left, right]字符段中至少有K个重复数字的最长子串
int myHelper(string &s, int k, int left, int right) {
if (left > right) {
//特殊情况
return 0;
}
vector<int> chCnt(26, 0);//字母计数器
//统计s串中[left, right]各个字符出现的次数
for (int index = left; index <= right; ++index)