题解:
题解1:用set来表示窗口
class Solution {
public:
//滑动窗口,用set来存放窗口值
int lengthOfLongestSubstring(string& s) {
set<char> window; //窗口,set不允许重复关键字,自动去重
int left=0,right=0; //窗口边界
int result=0,n=s.size();
while(right<n)
{
if(window.find(s[right])==window.end())//没有出现重复字符,继续扩大窗口
{
window.insert(s[right++]);
result=max(result,(int)window.size());
}
else//出现重复字符,缩小窗口
{
window.erase(s[left++]);
}
}
return result;
}
};
题解2:用hashmap来表示窗口
class Solution {
public:
int lengthOfLongestSubstring(string s) {
/*解法2:使用hashmap*/
unordered_map<char,int> recond;
int left=0,result=0;
for(int right=0;right<s.size();++right)
{
//若新遍历到字符已存在,那么我们直接将left更新到重复字符的下一个位置(隐含条件:重复字符下一个位置大于窗口的左边界下标);若不存在,则left不变
left=max(left,recond[s[right]]);
recond[s[right]]=right+1;//该字符的下个位置
result=max(result,right-left+1);
}
return result;
}
};