3. 无重复字符的最长子串(中)
题目
- 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
示例 2:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解:滑动窗口
- 思路:使用js的Set存不重复的子串,左右指针刚开始指向字符串开头,右指针逐个往后移,当右指针的元素不在Set中就加入,并更新最大长度;如果右指针的元素在Set中:在Set中移除i的元素,i++,一直到j所指的元素可以放进Set。
var lengthOfLongestSubstring = function(s) {
if (s.length === 0) {
return 0;
}
let max = 0;
let i = 0; // 左指针
let j = 0; // 右指针
const charSet = new Set(); // 用于存储当前窗口的字符
while (j < s.length) {
if (!charSet.has(s[j])) {
// 当前字符不在窗口内,移动 j 指针
charSet.add(s[j]);//添加元素到窗口
max = Math.max(max, j - i + 1); // 更新最大长度
j++;
} else {
// 当前字符在窗口内,删除i指针的元素,直到j指针元素可以放进窗口内
charSet.delete(s[i]);
i++;//移动 i 指针
}
}
return max;
};