本题主要使用滑动窗口算法,定义左指针lp, 右指针rp,将字符串作为数组处理就好。
滑动窗口主要由两个循环组成,若未满足条件则将右指针向右移,满足条件则左指针向右移。
本题的条件为窗口中是否有重复的字符。
一般来说,滑动窗口的基本模版是这样的:
while (右指针移动范围)
{
while (满足条件)
{
//数据操作
//左指针右移
}
//数据操作
//右指针右移
}
本题哈希表仅作为数据存储的容器。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0; //判空
unordered_set<char> map; //力扣这里如果用unordered_map定义哈希表insert会出现问题
//反正我是这样的:-(
int sum = 0; //最后的结果存在这里
int lp = 0, rp = 0; //定义左右指针
for(; rp < s.size(); rp++){ //滑动窗口,条件:存在相同字符
while(map.find(s[rp]) != map.end()){ //先判断哈希表中是否存入了相同字符,
//否则会出现自己找到自己的情况
map.erase(s[lp]); //若找到相同字符则删掉哈希表中key = lp的值
lp++; //左指针右移
}
map.insert(s[rp]); //向哈希表中填入元素
sum = max(sum, rp - lp + 1); //判断结果,位数从零开始算所以最后结果要加一
}
return sum;
}
}
};