本文是关于力扣第三题的解法,里面的解法涉及到一种set数据结构。
大家先了解一下set数据结构(类数组)的特性: Set类似于数组,但是它里面每一项的值是唯一的,没有重复的值,Set是一个构造函数,用来生成set的数据结构。
let s = new Set();
let arr = [2, 3, 5, 4, 5, 2, 2];
arr .forEach(item => s.add(item)); //向set添加重复的值
for (let i of s) {
console.log(i);
} // 2 3 5 4 结果set不会添加重复的值
了解以上性质后,题目的正解代码及解析如下:
var lengthOfLongestSubstring = function(s) {
//此题同样采用双指针的方法。
let i = 0
let j = 0
let maxLength = 0
//假设在s的长度小于2时,他自己本身的长度也就是我们需要的最大长度
if(s.length<2){
return s.length
}
//创建一个set类数组对象,它的特点就是里面的元素不重复
let set = new Set()
for(let i = 0;i<s.length;i++){
if(!set.has(s[i])){
set.add(s[i])
//在向set添加元素时务必同时每次的检查和更新最大长度。
maxLength = Math.max(maxLength,set.size)
}
else{
//如果出现与set数据结构里相同的元素。则开始将set头部的元素删除,一直删除到set里不存在现在遍历到的元素。
//如果不删除前面可能造成重复的元素,那么遍历到的这个元素是永远都加不进去的,也就是检测无法进行下去。
while(set.has(s[i])){
set.delete(s[j])
//由于这个数据结构删除不会想数组那样后面的元素全都往前移一位,所以删除后j要走到下一位。
j++
}
set.add(s[i])
}
}
return maxLength
};