SakuraSnow's blog SakuraSnow's blog
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

SakuraSnow

一只前端咸鱼
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据结构

  • Leetcode

    • 001-Two Sum[两数之和]
    • 002-Add Two Numbers[两数相加].md
    • 003-Longest Substring Without Repeating Characters[无重复字符的最长子串]
      • 004-Reverse-integer[整数反转]
      • 008-String to Integer (atoi)[字符串转整数]
      • 009-Palindrome Number[回文数]
    • 算法
    • Leetcode
    SakuraSnow
    2022-03-09

    003-Longest Substring Without Repeating Characters[无重复字符的最长子串]

    # 题目

    Given a string s, find the length of the longest substring without repeating characters.

    # example

    Input: s = "abcabcbb"
    Output: 3
    Explanation: The answer is "abc", with the length of 3.
    
    1
    2
    3
    Input: s = "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    
    1
    2
    3
    Input: s = "pwwkew"
    Output: 3
    Explanation: The answer is "wke", with the length of 3.
    Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.
    
    1
    2
    3
    4

    # 我的思路

    用Map存储最长子串里的元素,在重复时重置Map,直到整个string遍历结束

    
    function lengthOfLongestSubstring(s: string): number {
        // start index and end index
        let start: number = 0,
            end: number = 0;
        // sub string max length
        let max = 0;
        // map charter to index
        let indexMap: Map<string, number> = new Map<string, number>();
        for (let i = 0; i < s.length; i++) {
            let char = s[i];
            if (indexMap.has(char)) {
                let newStartIndex: number = indexMap.get(char) as number;
                // 如果已经在map里
                // 重置窗口和map
    
                // 删除窗口外的元素
                removeEleFromMap(s.slice(start, newStartIndex + 1), indexMap);
                // 更新map里的startIndex
                indexMap.set(char, i);
                start = newStartIndex as number + 1;
            } else {
                // 如果不再map里
                // 加入map & 窗口长度加1
                indexMap.set(char, i);
            }
            end = i;
            // 更新max
            max = Math.max(max, end - start + 1);
        }
    
        // console.log(max);
        return max;
    
    
    };
    
    function removeEleFromMap<T, P>(eles: Iterable<T>, map: Map<T, P>) {
        for (const ele of eles) {
            map.delete(ele);
        }
    }
    
    // console.log(lengthOfLongestSubstring("abcabcbb"));
    // console.log(lengthOfLongestSubstring("bbbbb"));
    // console.log(lengthOfLongestSubstring("pwwkew"));
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    # 最优解

    最优解和我的复杂度差不多,都是O(n),空间复杂度应该是这个好点

    而且代码简洁很多

    function lengthOfLongestSubstring(s: string): number {
        // start index and end index
        let start: number = 0,
            end: number = 0;
        // sub string max length
        let max: number = 0;
        // store charter
        let set: Set<string> = new Set<string>();
        for (let i = 0; i < s.length; i++) {
            let char = s[i];
            if (set.has(char)) {
                // 如果重复 移动左指针 & 从set中移除
                let j = start;
                // 查找左指针移动到的位置
                while (s[j] !== char) {
                    set.delete(s[j]);
                    j++;
                }
                start = j + 1;
            } else {
                // 如果不重复 移动右指针 & 添加到set中
                set.add(s[i]);
                end = i;
            }
            max = Math.max(max, end - start + 1);
        }
        // console.log(max);
        return max;
    };
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #算法#Leetcode#滑动窗口
    上次更新: 2022/03/09, 15:16:52
    002-Add Two Numbers[两数相加].md
    004-Reverse-integer[整数反转]

    ← 002-Add Two Numbers[两数相加].md 004-Reverse-integer[整数反转]→

    最近更新
    01
    009-Palindrome Number[回文数]
    03-10
    02
    008-String to Integer (atoi)[字符串转整数]
    03-10
    03
    004-Reverse-integer[整数反转]
    03-09
    更多文章>
    Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×