滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。
在具体使用之前,我们知道窗口实际是两个指针之间形成的区域,那关键就是这两个指针是如何移动的。
1.初始时,左右指针left,right都指向第0个元素,窗口为[left,right),注意这里是左闭右开,因此初始窗口[0,0)区间没有元素,符合我们的初始定义
2.开始循环遍历整个数组元素,判断当前right指针是否超过整个数组的长度,是退出循环,否则执行第3步
3.然后right指针开始向右移动一个长度,并更新窗口内的区间数据
4.当窗口区间的数据满足我们的要求时,右指针right就保持不变,左指针left开始移动,直到移动到一个不再满足要求的区间时,left不再移动位置
5.执行第2步
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let left = 0; // 左指针
let right = 0; // 右指针
let arr = [];
let max = 0; // 最长长度
// 当右指针不越界的时候
while(right < s.length){
for(let i = 0; i < s.length; i++){
// 数组中不存在时,将数据放进窗口
if(arr.indexOf(s[i]) === -1){
arr.push(s[i])
}else{
arr.push(s[i])
// 数组中存在时,将前面的数据删掉,且左指针右移
arr.splice(0, arr.findIndex(j=> j === s[i])+1)
left++
}
// 每次右指针都要右移,且更新最长长度的值
right++
max = Math.max(arr.length,max)
}
}
return max
};