class Solution {public: string minWindow(string s, string t) { unordered_map<char,int> need,window; for(char c:t){ need[c]++; } int left=0,right=0; int valid=0; //记录最小覆盖字串的起始索引和长度 int start=0,len=INT_MAX; while(right<s.size()){ //c是将移入窗口的字符 char c=s[right]; //右移窗口 right++; if(need.count(c)){ window[c]++; if(window[c]==need[c]){ valid++; } } //判断窗口是否收缩 while(valid==need.size()){ //收缩窗口时更新数据,更新最小覆盖字串 if(right-left<len){ start=left; len=right-left; } //d是将要移出窗口的字符 char d=s[left]; //窗口左移 left++; //进行窗口内数据的一系列更新 if(need.count(d)){ if(window[d]==need[d]){ valid--; } window[d]--; } } } //返回最小覆盖子串 return len==INT_MAX?" ":s.substr(start,len); }};
class Solution {public: bool checkInclusion(string s1, string s2) { unordered_map<char,int> need,window; for(char c:s1){ need[c]++; } int left=0,right=0; int valid=0; while(right<s2.size()){ char c=s2[right]; right++; // 进行窗口内数据的一系列更新 if(need.count(c)){ window[c]++; if(window[c]==need[c]){ valid++; } } // 判断左侧窗口是否要收缩 while(right-left>=s1.size()){ // 在这里判断是否找到了合法的子串 if(valid==need.size()){ return true; } char c=s2[left]; left++; // 进行窗口内数据的一系列更新 if(need.count(c)){ if(window[c]==need[c]){ valid--; } window[c]--; } } } return false; }};
class Solution {public: vector<int> findAnagrams(string s, string p) { unordered_map<char,int> need,window; for(char c:p){ need[c]++; } int left=0,right=0; int valid=0; //记录结果 vector<int> res; while(right<s.size()){ char c=s[right]; right++;//扩大窗口 // 进行窗口内数据的一系列更新 if(need.count(c)){ window[c]++; if(window[c]==need[c]){ valid++; } } // 判断左侧窗口是否要收缩 while(right-left>=p.size()){ // 当窗口符合条件时,把起始索引加入 res if(valid==need.size()){ res.push_back(left); } char c=s[left]; left++; // 进行窗口内数据的一系列更新 if(need.count(c)){ if(need[c]==window[c]){ valid--; } window[c]--; } } } return res; }};
class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char,int> window; int left=0,right=0; int res=0; while(right<s.size()){ char c=s[right]; right++; // 进行窗口内数据的一系列更新 window[c]++; // 判断左侧窗口是否要收缩,是否存在重复元素 while(window[c]>1){ char d=s[left]; left++; // 进行窗口内数据的一系列更新 window[d]--; } // 在这里更新答案,在判断完是否有重复元素后再更新 res=max(res,right-left); } return res; }};