暴力求解所有区间情况,超时。。。==
class Solution { public: int longestSubstring(string s, int k) { int maxLength=0; map<int,int> count; for(int i=0;i<s.size();i++) count[s[i]]++; set<int> wrongNum; for(map<int,int>::iterator it=count.begin();it!=count.end();it++) { if(it->second<k) wrongNum.insert(it->first); } //3 for(int i=0;i<s.size();i++) { map<int,int> tempCount=count; set<int> tempWrongNum=wrongNum; for(int j=s.size()-1;j>=i;j--) { if(tempWrongNum.empty()) { maxLength=max(maxLength,j-i+1); break; } tempCount[s[j]]--; if(tempCount[s[j]]==0) tempWrongNum.erase(s[j]); else if(tempCount[s[j]]<k) tempWrongNum.insert(s[j]); else{} } count[s[i]]--; if(count[s[i]]==0) wrongNum.erase(s[i]); else if(count[s[i]]<k) wrongNum.insert(s[i]); else{} } return maxLength; } };参考discuss,采用分治的思想求解,减少时间的复杂度,不用再计算所有的区间。 主要利用的时,对于出现次数小于k的那些位置,一定不再substr的区间上,可以将它们作为分界点,再计算左右两部分区间的max。
class Solution { public: int longestSubstring(string s, int k) { if(s.size()==0) return 0; int maxLength=0; map<int,int> count; for(int i=0;i<s.size();i++) count[s[i]]++; char wrong; map<int,int>::iterator it; for(it=count.begin();it!=count.end();it++) { if(it->second<k) { wrong=it->first; break; } } if(it==count.end()) return s.size(); int mid; for(int i=0;i<s.size();i++) { if(s[i]==wrong) { int left=longestSubstring(s.substr(0,i), k); int right=longestSubstring(s.substr(i+1), k); return max(left,right); } } } };