算法:无重复字符的最长子串

124 阅读1分钟

leetcode #3:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 leetcode.cn/problems/lo…

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
/**
 * 找到字符串中不重复出现的字符的最大长度
 * @param {string} s - 输入的字符串
 * @returns {number} - 不重复字符的最大长度
 */
function lengthOfLongestSubstring(s) {
    // 用于存储字符的最后出现位置
    let charIndexMap = new Map();
    // 滑动窗口的左边界
    let left = 0;
    // 最大长度
    let maxLength = 0;

    for (let right = 0; right < s.length; right++) {
        // 当前字符
        let currentChar = s[right];

        // 如果当前字符已经在窗口中出现过,更新左边界
        if (charIndexMap.has(currentChar)) {
            // 更新左边界,取当前字符上一次出现位置的下一个位置和当前左边界的最大值
            left = Math.max(charIndexMap.get(currentChar) + 1, left);
        }

        // 更新当前字符的最后出现位置
        charIndexMap.set(currentChar, right);

        // 更新最大长度
        maxLength = Math.max(maxLength, right - left + 1);
    }

    return maxLength;
}

// 示例用法
let s = "abcabcbb";
console.log(lengthOfLongestSubstring(s)); // 输出: 3