滑动窗口的两题~有点难度
3. 无重复字符的最长子串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//特殊值的判断
if(!s.size()) return 0;
int res=INT_MIN;
int start=0;
unordered_set
for(int end=0;end while(set.find(s[end])!=set.end()){ //在这里删除就相当于更新了窗口的大小(左边界更新) set.erase(s[start]); start++; } res=max(res,end-start+1); //右边界更新窗口大小 set.insert(s[end]); } return res; } }; 76. 最小覆盖子串 class Solution { public: string minWindow(string s, string t) { if(s.size() int start=0; int size=INT_MAX; int L=0;//记录最后结果的左边界,以便进行字符串的拼接 unordered_map int needCount=t.size();//记录所需字符的数量 for(auto it :t){ map[it]++; } for(int end=0;end if(map[s[end]]>0){//哈希表里value>0的元素就是所需要的字符 needCount--; } map[s[end]]--;//更新哈希表 //needCount==0证明窗口里已经包含了子串里所有的字符 if(needCount==0){ //缩小窗口到需要的一个字符,map[s[start]]<0的元素一定是我们不需要的字符 while(start map[s[start]]++; start++; } //更新窗口大小并记录左边界 if(size>end-start+1){ size=end-start+1; L=start; } //左边界右移,寻找满足条件的下一个滑动窗口,左边界右移之前需要释放map[s[start]] map[s[start]]++; start++; needCount++; } } return size==INT_MAX? "": s.substr(L,size); } };



