思路
采用滑动窗口的思想:扩张 + 收缩
首先定义两个指针,首先(右指针)扩张到滑动窗口不满足条件的时候暂停,(左指针)开始收缩窗口,让窗口满足条件后再进行扩张(右指针)
实现
const str = 'ababcdadee'
function lengthOfLongestSubstring(s) {
const len = s.length;
let result = 0, left = 0, right = 0;
let set = new Set(); // 用来存储子串
while(left < len) {
while(right < len && !set.has(s[right])) {
// 如果set中没有重复的字符,则右指针一直扩张,同时将字符存入set中
set.add(s[right]);
right++;
}
// 如果不满足 !set.has(s[right])这个条件会执行以下代码:
// 先计算窗口长度
result = Math.max(result, right - left);
// 从左开始删除set中重复的字符,然后收缩左指针
set.delete(s[left]);
left++
}
return result;
}
console.log(lengthOfLongestSubstring(str)); // 4