【javascript算法:力扣第三题,最长无重复字符串】面试常考!!

286 阅读1分钟

本文是关于力扣第三题的解法,里面的解法涉及到一种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
};