一、题目
1、题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/longest-substring-without-repeating-characters/
二、解题报告
1、思路分析
(
1
)
(1)
(1)使用滑动窗口,遍历字符串,如果当前字符在滑动窗口内不存在,则将其加入滑动窗口(即滑动窗口右边界扩一位)
(
2
)
(2)
(2)如果当前字符在滑动窗口内存在,则滑动窗口左边界右移直到相同的字符不在窗口内。
2、时间复杂度
时间复杂度为O(n^2)
3、代码详解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> vis;
int l = 0;
int r = 0;
int maxlen = 0;
while (r < s.size()) {
while (vis.find(s[r]) != vis.end()) {
vis.erase(s[l]);
l++;
}
vis.insert(s[r]);
r++;
maxlen = max(maxlen, r - l);
}
return maxlen;
}
};
三、本题小知识
1.滑动窗口模板
第一步,定义滑动窗口左右边界指针
第二步,根据题目逻辑控制左右边界移动
2.类似题目
159. 至多包含两个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串
30. 串联所有单词的子串
76. 最小覆盖子串
159. 至多包含两个不同字符的最长子串
209. 长度最小的子数组
239. 滑动窗口最大值
567. 字符串的排列
632. 最小区间
727. 最小窗口子序列