无反复字符的最长子串

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;};