给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3

  • 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
  • 请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。

示例 4:
输入: s = “”
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

    思路:

  • s不能为空的边界判断,将s先转成数组

  • 给一个双指针j,第二个指针,为了每一次重复取出之后,下一次遍历能够在开始时候的后一位
  • 比如说”aab”, 第二个a开始重复会取出第一个a,然后下次遍历应该是从第二个a开始
  • 如果 everyItem 中没有与str[i]重复的,放进去,然后下一位
  • 如有有重复的,组织hash表
  • 当前everyItem的length为key,value为everyItem每一项组成的字符串
  • 清空掉 everyItem 为了下一次放进去不重复的字符串
  • 第二个指针往后移动一个,从第二个指针开始遍历
    1. var lengthOfLongestSubstring = function (s) {
    2. // 不能为空
    3. if (s === '') return 0
    4. // 先转成数组
    5. const str = s.split('')
    6. const res = {};
    7. const everyItem = [];
    8. // 第二个指针,为了每一次重复取出之后,下一次遍历能够在开始时候的后一位
    9. // 比如说"aab", 第二个a开始重复会取出第一个a,然后下次遍历应该是从第二个a开始
    10. let j = 0
    11. for (let i = 0; i < str.length;) {
    12. // 如果 everyItem 中没有与str[i]重复的,放进去,然后下一位
    13. // 如有有重复的,组织hash表
    14. // 当前everyItem的length为key,value为everyItem每一项组成的字符串
    15. // 清空掉 everyItem 为了下一次放进去不重复的字符串
    16. // 第二个指针往后移动一个,从第二个指针开始遍历
    17. if (everyItem.indexOf(str[i]) === -1) {
    18. everyItem.push(str[i]);
    19. i++
    20. } else {
    21. res[everyItem.length] = everyItem.join("")
    22. everyItem = []
    23. j += 1
    24. i = j
    25. }
    26. }
    27. // 避免 undefined,有的可能为:' '
    28. const num = Object.keys(res).pop() || 0
    29. // 避免最后没有重复的
    30. return Math.max(num, everyItem.length) || 1
    31. }
    32. const s = lengthOfLongestSubstring("aab")
    33. console.log(s);