滑动窗口的两题~有点难度
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//特殊值的判断
if(!s.size()) return 0;
int res=INT_MIN;
int start=0;
unordered_set<char>set;//利用哈希表来判断是否出现了重复的字符,若重复就删除哈希表中的元素,一直删除到没有重复元素为止
for(int end=0;end<s.size();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;
}
};
class Solution {
public:
string minWindow(string s, string t) {
if(s.size()<t.size()) return "";
int start=0;
int size=INT_MAX;
int L=0;//记录最后结果的左边界,以便进行字符串的拼接
unordered_map<char,int>map;//字典哈希,value>0表示还需几个字符,<0表示多余,=0表示刚好
int needCount=t.size();//记录所需字符的数量
for(auto it :t){
map[it]++;
}
for(int end=0;end<s.size();end++){
if(map[s[end]]>0){//哈希表里value>0的元素就是所需要的字符
needCount--;
}
map[s[end]]--;//更新哈希表
//needCount==0证明窗口里已经包含了子串里所有的字符
if(needCount==0){
//缩小窗口到需要的一个字符,map[s[start]]<0的元素一定是我们不需要的字符
while(start<end&&map[s[start]]<0){
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);
}
};