3.无重复字符的最长子串
- 来源:力扣(LeetCode)
- 链接:
https://leetcode.cn/problems/longest-substring-without-repeating-characters
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
方法:滑动窗口
用一个指针与无序哈希集来实现一个动态队列,详解:
class Solution {
public:
int max(int a,int b){
if(a > b) return a;
else return b;
}
//本体用滑动窗口来解决,我们需要维护一个没有重复字符的队列
//遇到新字符则入队,并更新最长子串长度
//如果遇到重复字符就出队,直到这个队列中没有重复的字符
int lengthOfLongestSubstring(string s) {
unordered_set <char> set;
//用无序哈希集合来存储出现过的字符
int left = -1;
//left表示滑动窗口的左指针
int max_len = 0;
//记录最长子串长度
for(int i = 0;i<s.size();i++)
//这里的循环变量i为滑动窗口的右指针
{
if(!set.count(s[i]))
{
//如果当前字符不是重复字符则加入map中
set.insert(s[i]);
max_len = max(i - left, max_len);
}
else{
//如果是重复的字符就从窗口的左边界开始消去字符,直到字符集里没有重复字符
while(set.count(s[i]))
{
++ left;
set.erase(s[left]);
}
//将当前字符加入字符集
set.insert(s[i]);
}
}
return max_len;
}
};