classSolution{public:intlengthOfLongestSubstring(string s){if(s.size()==0)return0;
unordered_set<char> lookup;int maxStr =0;int left =0;for(int i =0; i < s.size(); i++){// 若之前出现过,此时需要移动左指针,直至出现一个全新的字符while(lookup.find(s[i])!= lookup.end()){
lookup.erase(s[left]);
left ++;}// 正常情况下直接更新当前最大值即可
maxStr =max(maxStr,i-left+1);
lookup.insert(s[i]);}return maxStr;}};
重复的DNA序列
classSolution{public List<String>findRepeatedDnaSequences(String s){
HashSet<String> seen =newHashSet<>();
HashSet<String> output =newHashSet<>();int len = s.length();int L =10;for(int i =0; i < len - L +1;++i){
String tmp_string = s.substring(i,i + L);if(seen.contains(tmp_string)){
output.add(tmp_string);}
seen.add(tmp_string);}returnnewLinkedList<String>(output);}}
最小覆盖子串
classSolution{public:
unordered_map<char,int> ori,cnt;boolcheck(){for(constauto&p : ori){if(cnt[p.first]< p.second){returnfalse;}}returntrue;}
string minWindow(string s, string t){// 将要检索包含的字符扔进ori图计数for(constauto&c : t){
ori[c]++;}int l =0, r =-1;int len = INT_MAX, ansL =-1;// 遍历while( r <int(s.size())){// 将s中与t中都出现过的字符计数存在cnt图中,存的是s中的字符和计数if( ori.find(s[++r])!= ori.end()){
cnt[s[r]]++;}// 满足s中出现的字符个数和种类都大于等于t中要求的,才能继续进行while(check()&& l <= r){// 满足要求,则更新满足要求的最小的len,同时更新ansLif(r - l +1< len){
len = r - l +1;
ansL = l;}// 此时左指针右移,判断是否还满足条件if(ori.find(s[l])!= ori.end()){
cnt[s[l]]--;}
l++;}}return ansL ==-1?string(): s.substr(ansL,len);}};