无反复字符的最长子串
1. 暴力解法
工夫复杂度:O(N^3)
空间复杂度:O(N)
- 设置两个指针,左、右指针同时指向第一个元素
- 一一挪动右指针,直至右指针所指向的值等于左指针时,终止本轮循环
- 让左指针向右走一位,重置右指针,让右指针等于左指针
-
反复第 2、3 步,直到左指针没有能够指向的值
2. 滑动窗口
工夫复杂度:O(N)
空间复杂度:O(N) - 设置左、指针同时指向第一个元素,将它存进 map 数组里
- 一一挪动右指针,直至右指针所指向的值等于左指针,存下以后字符串长度,左指针也向右挪动到该反复元素的开端
-
以此类推,直至遍历实现,存储最大的字符串长度
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; };