头图

无重复字符的最长子串

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

全栈冲冲冲
1 声望0 粉丝

知识不应该区别国界,每个人生活在这个美好的时代都应该贡献自己的价值,我们国内的程序员工程师都应该多学本职以外的IT知识,不要局限于应用层,让我国的IT行业更加茁壮成长


引用和评论

0 条评论