3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)return 0;
unordered_map<char,int> ss;
int ans=0;
int l=0;
int r=0;
for(int i=0;i<s.size();i++){
if(ss.find(s[i])!=ss.end()){
if(i-l>ans)ans=i-l;
r=ss[s[i]];
for(int j=l;j<=r;j++){
ss.erase(s[j]);
}
l=r+1;
r=i;
}
else{
if(i-l+1>ans)
ans=i-l+1;
}
ss[s[i]]=i;
}
return ans;
}
};
法二
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)return 0;
unordered_set<char> h;
int l=0;
int r=0;
int ans=0;
for(int i=0;i<s.size();i++){
while(r<s.size()&&!h.count(s[r])){
h.insert(s[r]);
r++;
}
if(r<s.size()&&h.count(s[r])){
h.erase(s[i]);
}
ans=max(ans,r-i);
}
return ans;
}
};