- 其实通过观察可以优化,我们制作一个窗口,让窗口中的字符串满足题目要求(无重复)
怎么让他满足要求呢? 那就要滑动窗口了,循环去掉左边第一个元素,直到窗口中元素无重复,此时再扩大窗口
滑动窗口有两个关键点:扩张 + 收缩
首先(右指针)扩张到滑动窗口不满足条件的时候暂停,
(左指针)开始收缩窗口,让窗口满足条件后再进行扩张(右指针)
function lengthOfLongestSubstring(s) {
let len = s.length;
let result = 0;
let set = new Set();
// 左指针用来收缩窗口
let left = 0;
// 右指针用来扩张窗口
let right = 0;
while (left < len) {
// 如果不重复,就不断扩张窗口,元素添加到set中
while (right < len && !set.has(s[right])) {
set.add(s[right]);
right++;
}
// 到这里说明有元素重复了,先记录子串长度,然后收缩窗口
result = Math.max(result, right - left);
// 收缩窗口
set.delete(s[left]);
left++;
}
return result;
}
var lengthOfLongestSubstring = function(s) {
let res = 0,i = 0;
let temp = new Array();
while(i < s.length) {
if(temp.indexOf(s[i]) === -1) {
temp.push(s[i]);
res = res > temp.length ? res : temp.length;
i++;
} else {
temp.shift();
}
}
return res;
};