3. 无重复字符的最长子串|刷题打卡

134 阅读1分钟

一、题目描述:

leetCode

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

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
输入: s = "pwwkew" 输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 示例 4: 输入: s = ""
输出: 0

二、思路分析:

整体思路就是维护一个无重复子字符串的区间,关键就是这个区间的左右边界了,右边界就是 i, 左边界需要用一个哈希表 map 来维护。

  1. 使用 map 来存储当前已经遍历过的字符,key 为字符,value 为下标,使用 left 来标记左边界,i 为当前遍历字符下标
  2. 遍历字符串,判断当前字符是否已经在 map 中存在,存在则更新左边界 left 为相同字符的下一位置,此时从 left 到 i 为最新的无重复子串,更新 max ,将当前字符与下标放入 map 中
  3. 最后,返回 max 即可

三、AC 代码:

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    // abcabcabc
    let max = 0, left = 0, len = s.length, map = new Map();
    for(let i = 0; i < len; i++) {
        const c = s.charAt(i);
        if(map.has(c)) {
            left = Math.max(left, map.get(c) + 1);
        }
        map.set(c, i);
        max = Math.max(max, i - left + 1);
    }
    return max;
};

四、总结:

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情