第一反应是双指针滑动窗口,但是尝试过发现,直接双指针是不对的,因为前一个指针不是单调的只往右走,还有可能往左走。
这道题目比较难,思路是要枚举区间中包含最大字符的个数,维护区间区间中包含的字符个数,以及满足要求的字符个数。当区间包含的字符个数等于满足要求的字符个数时,那么区间中所有字符都满足要求。由于没枚举所有字符个数。这样一定能找到答案。
class Solution {
public:
int longestSubstring(string s, int k) {
// 枚举区间中最多包含不同的字符个数1-26
// 维护窗口中包含不同的字符个数,以及满足要求的字符个数
int res = 0;
for(int p=1;p<=26;p++){
unordered_map<char,int> freq;
int num = 0, count = 0;
for(int i=0,j=0;j<s.size();j++){
freq[s[j]]++;
if(freq[s[j]]==1) num++;
if(freq[s[j]]==k) count++;
while(num>p){
freq[s[i]]--;
if(freq[s[i]]==0){
num--;
}
if(freq[s[i]]==k-1){
count--;
}
i++;
}
if(num==count){
res = max(res,j-i+1);
}
}
}
return res;
}
};
’