假设x
的出现次数<k
,那么x
就不可能出现在最长子串中,以x
为界,分为左子串和右子串,再分别求左子串和右子串的最长子串。
int longestSubstring(string s, int k) {
if(k<=1) return s.size();
if(s.empty() || s.size()<k) return 0;
unordered_map<char,int> m;
for(char c:s)
++m[c];
int i=0;
for(;i<s.size() && m[s[i]]>=k;++i);
if(i == s.size()) return s.size();
int l = longestSubstring(s.substr(0,i),k);
for(;i<s.size() && m[s[i]]<k;++i);
int r = longestSubstring(s.substr(i),k);
return max(l,r);
}