leetcode3.最长无重复子串

50 阅读1分钟

leetcode3

解题思路:

最简单的处理方式采用双层循环暴力处理。 双循环的主要思路为第一层循环以每一个元素为开始元素,第二层循环从上层元素下一个元素开始如果没有重复的就继续往下走,直到有相同的元素,然后计算长度。

采用双指针的方式处理可以减少循环,从而降低时间复杂度。 右指针作为基础的遍历从第一个位置开始往后遍历,然后判断左指针如何移动,本题的移动方式为 如果当前元素在从左指针和右指针中间的话,左指针重新赋值。 s.indexOf(s[right], left); 从left位置开始查找s[right],如果存在就返回index。 因为查找的元素为s[right],所以在right这个位置一定会存在的。

let str = 'abcabcbb';
str = 'bbbbb';
str = 'pwwkew';

// 采用双指针: 右边指针如何移动 左指针如何移动
function sub(s) {
  let res = 0,
    len = s.length;
  let left = 0,
    right = 0;
  for (; right < len; right++) {
    let pos = s.indexOf(s[right], left);
    if (pos == right) {
      res = Math.max(res, right - left + 1);
    } else {
      left = pos + 1;
    }
  }
  return res;
}
console.log(sub(str));