【JS】使用滑动窗口得到无重复字符的最长子串
题目
思路
- 本题采用滑动窗口思想,定义左右指针作为滑动窗口的边界,使用Set数据结构处理重复字符,需要注意的是:每次遍历时采用Math.max方法实时更新最长子串的长度;当左指针移动时,set要删除对应字符。
步骤
- 初始化:定义变量
maxLen
用于记录无重复字符的最长子串的长度,初始值为0
;定义变量left
作为滑动窗口的左边界,初始值为0
;创建一个Set
数据结构charSet
用于存储当前滑动窗口内的字符,利用Set
的元素唯一性来判断字符是否重复。- 遍历字符串:通过
for
循环遍历字符串s
,right
作为滑动窗口的右边界。- 处理重复字符:当发现
charSet
中已经存在当前字符s[right]
时,说明出现了重复字符。此时通过while
循环不断移动滑动窗口的左边界left
,并从charSet
中删除对应的字符,直到窗口内不再有重复字符。- 添加字符并更新长度:将当前字符
s[right]
添加到charSet
中,然后更新maxLen
,取当前maxLen
和当前窗口长度(right - left + 1
)中的较大值。- 返回结果:遍历结束后,
maxLen
即为无重复字符的最长子串的长度,将其返回。
示例代码
var lengthOfLongestSubstring = function(s) {
// 用于存储无重复字符的最长子串的长度,初始值为0
let maxLen = 0;
// 滑动窗口的左边界索引,初始值为0
let left = 0;
// 使用Set数据结构来存储当前滑动窗口内的字符,Set的特性是元素唯一
let charSet = new Set();
// 遍历字符串s,right作为滑动窗口的右边界索引
for (let right = 0; right < s.length; right++) {
// 如果当前字符已经在Set中,说明有重复,需要移动left指针来缩小窗口
// 直到窗口内不再有重复字符
while (charSet.has(s[right])) {
// 从Set中删除滑动窗口左边界对应的字符
charSet.delete(s[left]);
// 左边界右移一位
left++;
}
// 将当前字符加入Set,此时窗口内无重复字符
charSet.add(s[right]);
// 更新最长子串的长度,取当前记录的最长长度maxLen和当前窗口长度(right - left + 1)中的较大值
maxLen = Math.max(maxLen, right - left + 1);
}
// 返回无重复字符的最长子串的长度
return maxLen;
};
欢迎指正!