/**
 * @param {string} s
 * @return {number}
 */

var lengthOfLongestSubstring = function(s) {
    let startIdx = 0
    let maxLength = 0
let curSet = new Set()
    for (let endIdx = 0; endIdx < s.length; endIdx++) {
        if (curSet.has(s[endIdx])) {
            var prevEndIdx = endIdx - 1
            maxLength = Math.max(prevEndIdx -  startIdx + 1, maxLength)
while (s[startIdx] !== s[endIdx]) {
            // 視窗左邊界向右收縮,更新 curSet
                curSet.delete(s[startIdx])
                startIdx++
            }
            startIdx++  // 左邊界已指到重複字母的位置,往右再收縮一格
        } else {
            curSet.add(s[endIdx])
        }
        if (endIdx === (s.length - 1)) {
            maxLength = Math.max(endIdx - startIdx + 1, maxLength)
        }
    }
    return maxLength
};

參考:用 JavaScript 解 LeetCode — Самая длинная подстрока без повторяющихся символов