题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
解法1 set
class Solution {
public:
int lengthOfLongestSubstring(string s)
{
unordered_set <char> curr;//存储当前滑动窗口内的字符
int n=s.size();
int l=0,r,res=0; //左右边界及最大个数
//l
//abcbdabcbb
// r
//此时curr中删除a,b然后再加入b,l指向了c
for(r=0;r<n;r++)// 遍历 右边界
{
while(curr.count(s[r])>0) //一直将set内的元素删除到右边界的元素
curr.erase(s[l++]);
curr.insert(s[r]);
if(res<r-l+1)
res=r-l+1;
}
return res;
}
};
解法2 map
class Solution {
public:
int lengthOfLongestSubstring(string s)
{
unordered_map <char,int> curr;//存储当前滑动窗口内的字符map,second存储下标
int n=s.size();
int l=0,r,res=0; //左右边界及最大个数
//l
//abcbdabcbb
// r
//此时curr中删除a,b然后再加入b,l指向了c
for(r=0;r<n;r++)// 遍历 右边界
{
if(curr.count(s[r])>0) //之前存在着和当前字符一样的字符
l=max(l,curr[s[r]]+1);//移动左指针
curr[s[r]]=r;
if(res<r-l+1) res=r-l+1;
}
return res;
}
};