SOURCE

// 思路
// 因为是无序字符 所以需要哈希表记录字符
// 用滑动窗口方法 以即将加入的下一个字符判断哈希表内是否出现重复
// 以此为条件 循环缩短窗口 直到窗口内哈希表不存在重复
// 再吸收字符 并判断结果值是否需要更新

function fn(source) {
    let max = 0 // 找最大值初始值就为0
    // 哈希表 记录滑动窗口内字符种类
    let map = new Set() // 因为不需要计数 用set就够了
    let start = 0 // 滑动窗口起始位置
    for (let end = 0; end < source.length; end++) {
        // 因为字符串不是按顺序排列 因此遇到重复的字符
        // 滑动窗口缩短不止一次 因此要用循环直到窗口内没有重复字符
        while (map.has(source[end])) {
            // 即将加入的字符在map中重复 则移动起始位置 缩短窗口
            // 因为要移动起始位置 因此原起始位置字符就要从map中移除
            map.delete(source[start])
            start++ // 移动起始位置
        }
        map.add(source[end]) // 将不重复的新字符添加到map
        if (max < end - start + 1) {
            // 当前窗口长度更长 更新max结果
            max = end - start + 1
        }
    }
    return max
}

// 验证
let str = "abcabcbb"
console.log('最长为' + fn(str)) // 3
console 命令行工具 X clear

                    
>
console