方法一:采用滑动窗 并采用标志位 确定是否将右边窗右移
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0, right = 0;
int len = s.length();
if(len <= 1) return len;
int max = 1;
for(int i = 1; i < len; i++)//右边窗
{
int flag = 0;//标志位 当其一直为0 说明当前窗内没有与s[i]一样的
for(int j = left; j < i; j++)//左边窗
{
if(s[i] == s[j])
{
flag = 1;
left = j + 1;
max = max > (i - left + 1)? max: (i - left + 1);
break;
}
}
if(flag == 0)
{
right = i;
max = max > (right - left +1)? max:(right - left +1);
}
}
return max;
}
};
方法二:采用哈希表+滑动窗
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> map; //记录每个字符的数量
int size = s.length();
if(size < 2) return size;
int left = 0, res = 0;
for(int i = 0; i < size; i++)
{
map[s[i]]++;
while(map[s[i]] > 1)//说明有重复字符
{
map[s[left]]--; //从左窗边开始依次删除字符 直到没有重复字符
left++;
}
res = max(res, i - left +1);//更新最长字符长度
}
return res;
}
};