给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 ****的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
题解:滑动窗口
滑动窗口的核心思想
- 用两个指针(
left和right)表示一个“窗口”,窗口里的字符串始终保持 无重复字符。 - 初始时,
left = right = 0。 - 每次把
right往右移,看新字符是否能放进窗口:- 如果没有重复 → 加进窗口,更新最大长度。
- 如果有重复 → 把
left往右移动,直到窗口里不再有重复。
这样整个字符串只需要扫描一遍,复杂度 O(n)。
var lengthOfLongestSubstring = function(strs) {
const set=new Set()
let left=0,maxLen=0
for(let right=0;right<strs.length;right++){
while(left<right){
if(strs.has(strs[right)){
strs.delete(str[left])
left++
}
}
strs.add(strs[right])
maxLen=Math.max(maxLen,right-left+1)
}
return maxLen
};
``