给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
核心思路(滑动窗口):
- 定义窗口边界:使用两个指针(
left
和right
)来表示当前窗口的左右边界。 - 移动窗口:右指针
right
向右移动,逐步扩大窗口,将字符加入集合。如果遇到重复字符,则移动左指针left
,缩小窗口,直到窗口内没有重复字符为止。 - 记录最大长度:在窗口每次调整时,计算窗口的长度,并更新最大长度记录。
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
unordered_set<char> str_set;
int max_len = 0;
int left = 0;
for (int right = 0; right < s.length(); right++)
{
//删除重复字符
while(str_set.find(s[right]) != str_set.end())
{
str_set.erase(s[left]);
left++;
}
//插入集合中
str_set.insert(s[right]);
max_len = max(max_len, right - left + 1);
}
return max_len;
}
};