数据结构与算法每日一题——哈希表+滑动窗口(3. 无重复字符的最长子串)

85 阅读1分钟

3. 无重复字符的最长子串

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    const set = new Set();
    // right,left 滑动窗口右、左边界
    let right = left = maxLength = 0;
    if (s.length === 0) {
        return 0;
    }
    for (right; right < s.length; right++) {
        // 当前元素不在set中,就加入set,然后更新最大长度
        if (!set.has(s[right])) {
            set.add(s[right]);
            maxLength = Math.max(maxLength, set.size);
        } else {
            // 有重复元素则不断让left++
            // 并删除窗口之间的元素
            while (set.has(s[right])) {
                set.delete(s[left]);
                left++;
            }
            set.add(s[right]);
        }
    }
    return maxLength;

    // let left = right = length = maxLength = 0
    // let set = new Set()
    // // 循环结束条件:右指针小于字符串最大长度
    // while (right < s.length) {
    //     // 如果set中没有这个值 加入+长度+1+置换最大chang
    //     if (!set.has(s[right])) {
    //         set.add(s[right])
    //         length++
    //         if (length > maxLength) {
    //             maxLength = length
    //         }
    //         right++;
    //     } else {
    //         // 如果遇到有一样的值,删除set中的值,长度-1
    //         while (set.has(s[right])) {
    //             set.delete[s[left]]
    //             left++
    //             length--
    //         }
    //         set.add(s[right])
    //          length++
    //         right++
    //     }
    // }
    // return maxLength
};