给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
本题采用滑动窗口算法,滑动窗口算法主要需要确定以下三点:
1.窗口内是什么?
2.什么情况下移动窗口的左边界?
3.什么情况下移动窗口的右边界?
答:
滑动窗口就是一个队列,我们需要对字符串进行遍历:首先把a放进窗口,符合题目要求,然后移动窗口的右边界,第二步放b,接着放c,当放到第四个字母a时,不满足题目的无重复要求,这时我们就需要移动窗口的左边界,把窗口内第一个字母a移除,也就是左边界位置+1。
滑动窗口内变成了bca,接着移动窗口的右边界,放入字母b,再次不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母b移除,也就是左边界位置+1。
滑动窗口内变成了cab,接着移动窗口的右边界,放入字母c,再次不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母c移除,也就是左边界位置+1。
滑动窗口内变成了abc,接着移动窗口的右边界,放入字母b,再次不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母a移除,也就是左边界位置+1。
滑动窗口内变成了bcb,还是不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母b移除,也就是左边界位置+1。
滑动窗口内变成了cb,接着移动窗口的右边界,放入字母b,再次不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母c移除,也就是左边界位置+1。
滑动窗口内变成了bb,还是不满足题目的无重复要求,需要移动窗口的左边界,将窗口内的第一个字母b移除,也就是左边界位置+1。
滑动窗口内变成了b。
遍历完毕,滑动窗口最多有三个字符,由此可见滑动窗口内最长不重复子串长度为3。
c++代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0){
return 0;
}
int left = 0;
unordered_set<char> set;
int maxLen = 0;
for(int i = 0; i < s.size(); i++){
while(set.find(s[i]) != set.end()){
set.erase(s[left]);
left++;
}
maxLen = max(maxLen,i - left + 1);
set.insert(s[i]);
}
return maxLen;
}
};