思路:分治法+递归
通过map来查找到不满k个的字符的下标,就可以将字符串进行分割,变成小子串。
class Solution {
public:
int longestSubString(const string &s,int left,int right,int k){
if(right-left+1<k){
return 0;
}
unordered_map<char,int> letters;
for(int i=left;i<=right;++i){
letters[s[i]]++;
}
vector<int> splits; //不满k个字符的元素的下标
for(int i=left;i<=right;++i){
if(letters.count(s[i])&&letters[s[i]]<k){
splits.push_back(i);
}
}
if(splits.size()==0){
return right-left+1;
}
int L=left,R;
int answer=0;
for(int i=0;i<splits.size();++i){
R=splits[i]-1;
answer=max(answer,longestSubString(s,L,R,k));
L=R+2;
}
//还需考虑最后一段
L=R+2,R=right;
answer=max(answer,longestSubString(s,L,R,k));
return answer;
}
int longestSubstring(string s, int k) {
return longestSubString(s,0,s.length()-1,k);
}
};
笔记:
- set范围构造函数:参数为指针地址,比如:
int a[]={1,2,3,4,5} set myset(a+2,a+4),则myset为{3,4}