原题目
代码分析
1.递归分治
用哈希表存储数组每个字符出现的次数, 从左往右查找, 以不满足的字符为分界点,找左边符合要求的数组和右边符合要求的数组
class Solution {
public:
int longestSubstring(string s, int k) {
if(s.size()<k)return 0;//当数组长小于k,返回0
int hash[26]={0};//存储数组每个字符出现的次数
for(auto c : s){
hash[c-'a']++;
}
int i = 0;
while(i < s.size()&&hash[s[i]-'a'] >= k){//找到不满足条件的字符,从该字符进行分割
i++;
}
if(i == s.size())return s.size();//如果都符合返回数组长度
int left = longestSubstring(s.substr(0,i),k);//判断不符合字符左边的数组是否符合,返回最大长度
while(i < s.size()&&hash[s[i]-'a'] < k){//去掉不满足的字符,对右侧进行分割
i++;
}
int right = longestSubstring(s.substr(i), k);//判断不符合字符右边的数组是否符合,返回最大长度
return max(left, right);//返回最大长度
}
};
class Solution {
public:
int dfs(string s, int left, int right, int k){
if(right-left<k){
return 0;
}
int hash[26]={0};
for(int i = left; i < right; i++){
hash[s[i]-'a']++;
}
int i = left;
while(i<right&&hash[s[i]-'a']>=k)i++;
if(i == right){
return right-left;
}
int left_len = dfs(s,left,i,k);
while(i<right&&hash[s[i]-'a']<k)i++;
int right_len = dfs(s,i, right,k);
return max(left_len,right_len);
}
int longestSubstring(string s, int k) {
return dfs(s, 0, s.size(), k);
}
};