// 3. 无重复字符的最长子串// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。// // 示例 1:// 输入: s = "abcabcbb"// 输出: 3 // 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。// 示例 2:// 输入: s = "bbbbb"// 输出: 1// 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。// 示例 3:// 输入: s = "pwwkew"// 输出: 3// 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。// 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。// 题解,// 1.滑动窗口剪切子串,js 中的slice其实就是一个滑动窗口// 2.起始在第一个位置,遇到重复字符,就把左指针向右移动一位// 3.记录所有长度/** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { // 起始在第一个位置 let l = 0; // 记录最大长度 let res = 0; // 如何判断是否重复呢,我们新建一个字典来保存键值,即该值和下标 let map = new Map(); // 开始遍历目标字符串 for(let i = 0; i < s.length; i += 1) { const c = s[i] // 如果找到了当前值,就是有重复的,我们将左指针向右移动,必须保证左指针在窗口外面 if(map.has(c) && map.get(c) >= l) { l = map.get(c) + 1; } res = Math.max(res, i - l + 1) // 将当前值存入map map.set(c, i) } return res};const s = "abcabcbb";console.log(lengthOfLongestSubstring(s));时间复杂度 O(n) 空间复杂度 O(m)