3. Longest Substring Without Repeating Characters

59 阅读1分钟

3. Longest Substring Without Repeating Characters

此题的关键在于结合 Map结构维护一个表结构实时记录重复字母的位置信息

解题思路

  1. 如果长度为 0 直接返回
  2. 假设最长字串长度 max = 0, 每次计算未重复字串开始的位置 start, 记录重复字母出现的位置 map
  3. 首先判断字母是否重复,如果重复需要更新 start 信息指向重复字母的下一个位置
  4. 更新 Map结构实时维护重复char的信息
  5. 计算此时未重复字符串长度 与 假设最长度 max,取较大值覆盖 max,

代码

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    if (s.length === 0) return s
    let max = 0
    let start = 0
    let map = new Map()
    for (let i =0; i < s.length; i++) {
        const char = s[i]
        const isRepeat = () => map.has(char)
        // 记录当 i 指针指向了重复字母时,start 需要更新到上一次这个字母出现时的下一个位置 
        const updateStart = () => {
            // 'abba' 当遍历到第二个 b 时
            //  map表是这样的 {a: 0, b: 1} start = 0,
            //  这时计算所得即  start = 2
            //  当遍历到第二个 a 时 {a: 0, b: 1} start = 2 , start = Math.max(2, 1),
            //  这时需要防止 start 指针重复回到 1 位置,所以需要计算两者较大的值
            start = Math.max(start, map.get(char) + 1)
        }
        if (isRepeat()) {
            updateStart()
        }
        // 每次循环都需要更新字母的位置信息
        map.set(char, i)
        // 由于需要计算 length 所以类似  0 - 0 需要加 1
        max = Math.max(max, i - start + 1)
    }
    return max
};