乐趣区

关于力扣:力扣-3-无重复字符的最长子串

无反复字符的最长子串

1. 暴力解法

工夫复杂度:O(N^3)
空间复杂度:O(N)

  1. 设置两个指针,左、右指针同时指向第一个元素
  2. 一一挪动右指针,直至右指针所指向的值等于左指针时,终止本轮循环
  3. 让左指针向右走一位,重置右指针,让右指针等于左指针
  4. 反复第 2、3 步,直到左指针没有能够指向的值

    2. 滑动窗口

    工夫复杂度:O(N)
    空间复杂度:O(N)

  5. 设置左、指针同时指向第一个元素,将它存进 map 数组里
  6. 一一挪动右指针,直至右指针所指向的值等于左指针,存下以后字符串长度,左指针也向右挪动到该反复元素的开端
  7. 以此类推,直至遍历实现,存储最大的字符串长度

    var lengthOfLongestSubstring = function (s) {
     // 哈希汇合,记录每个字符是否呈现过
     const occ = new Set();
     const n = s.length;
     // 右指针,初始值为 -1,相当于咱们在字符串的左边界的左侧,还没有开始挪动
     let rk = -1,
         ans = 0;
     for (let i = 0; i < n; ++i) {if (i != 0) {
             // 左指针向右挪动一格,移除一个字符
             occ.delete(s.charAt(i - 1));
         }
         while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) {
             // 一直地挪动右指针
             occ.add(s.charAt(rk + 1));
             ++rk;
         }
         // 第 i 到 rk 个字符是一个极长的无反复字符子串
         ans = Math.max(ans, rk - i + 1);
     }
     return ans;
    };
退出移动版