1. // 3. 无重复字符的最长子串
    2. // 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
    3. //
    4. // 示例 1:
    5. // 输入: s = "abcabcbb"
    6. // 输出: 3
    7. // 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    8. // 示例 2:
    9. // 输入: s = "bbbbb"
    10. // 输出: 1
    11. // 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    12. // 示例 3:
    13. // 输入: s = "pwwkew"
    14. // 输出: 3
    15. // 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    16. // 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    17. // 题解,
    18. // 1.滑动窗口剪切子串,js 中的slice其实就是一个滑动窗口
    19. // 2.起始在第一个位置,遇到重复字符,就把左指针向右移动一位
    20. // 3.记录所有长度
    21. /**
    22. * @param {string} s
    23. * @return {number}
    24. */
    25. var lengthOfLongestSubstring = function(s) {
    26. // 起始在第一个位置
    27. let l = 0;
    28. // 记录最大长度
    29. let res = 0;
    30. // 如何判断是否重复呢,我们新建一个字典来保存键值,即该值和下标
    31. let map = new Map();
    32. // 开始遍历目标字符串
    33. for(let i = 0; i < s.length; i += 1) {
    34. const c = s[i]
    35. // 如果找到了当前值,就是有重复的,我们将左指针向右移动,必须保证左指针在窗口外面
    36. if(map.has(c) && map.get(c) >= l) {
    37. l = map.get(c) + 1;
    38. }
    39. res = Math.max(res, i - l + 1)
    40. // 将当前值存入map
    41. map.set(c, i)
    42. }
    43. return res
    44. };
    45. const s = "abcabcbb";
    46. console.log(lengthOfLongestSubstring(s));
    47. 时间复杂度 O(n) 空间复杂度 Om