无重复字符的最长子串3
地址:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
题干
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子 串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
思路
依然是滑动窗口,用一个set来存储窗口的字符。
题解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
int lptr=0;
int rptr=0;
unordered_set<char> slided_window;// 存储当前窗口内的字符
int maxLen = 0;
for(rptr;rptr<s.size();++rptr){
// 如果当前字符已经在窗口中,移动左指针直到可以加入
while(slided_window.find(s[rptr])!=slided_window.end()){// 这就是找到了的意思
slided_window.erase(s[lptr]);// 删掉这个重复的元素
lptr++;// 左指针继续往前探索
}
slided_window.insert(s[rptr]);// 没有重复的了,可以加新的,新的元素在右指针这里
maxLen = max(rptr-lptr+1,maxLen);
}
return maxLen;
}
};