无重复字符的最长子串

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

无重复字符的最长子串_第1张图片

function lengthOfLongestSubstring(s) {
    // 用于存储字符及其在字符串中最新出现的索引
    const charIndexMap = new Map();
    // 记录最长无重复字符子串的长度
    let maxLength = 0;
    // 滑动窗口的起始位置
    let start = 0;

    // 遍历字符串,end 作为滑动窗口的结束位置
    for (let end = 0; end < s.length; end++) {
        const currentChar = s[end];
        // 如果当前字符已经在 map 中,并且其索引大于等于滑动窗口的起始位置
        if (charIndexMap.has(currentChar) && charIndexMap.get(currentChar) >= start) {
            // 移动滑动窗口的起始位置到该字符上一次出现位置的下一个位置
            start = charIndexMap.get(currentChar) + 1;
        }
        // 更新当前字符在 map 中的索引
        charIndexMap.set(currentChar, end);
        // 计算当前滑动窗口的长度
        const currentLength = end - start + 1;
        // 更新最长无重复字符子串的长度
        maxLength = Math.max(maxLength, currentLength);
    }

    return maxLength;
}

// 测试示例
const s = "abcabcbb";
console.log(lengthOfLongestSubstring(s));

代码解释

整体思路
本题使用滑动窗口算法来解决。滑动窗口是一种常用的算法技巧,通过维护一个可变大小的窗口在数组或字符串上进行操作。在本题中,我们使用一个滑动窗口来表示当前的无重复字符子串,通过不断移动窗口的起始和结束位置,找到最长的无重复字符子串。

代码步骤分析

初始化变量:

  • charIndexMap:使用 Map 对象来存储字符及其在字符串中最新出现的索引。
  • maxLength:用于记录最长无重复字符子串的长度,初始化为 0。
  • start:滑动窗口的起始位置,初始为 0。

遍历字符串:

  • 使用 for 循环遍历字符串,end 作为滑动窗口的结束位置。
  • 对于每个字符 currentChar,检查它是否已经在 charIndexMap 中,并且其索引大于等于滑动窗口的起始位置 start。
  • 如果满足条件,说明该字符在当前滑动窗口内已经出现过,需要移动滑动窗口的起始位置 start 到该字符上一次出现位置的下一个位置。

更新字符索引和窗口长度:

  • 更新当前字符 currentChar 在 charIndexMap 中的索引为 end。 计算当前滑动窗口的长度
    currentLength 为 end - start + 1。
  • 更新 maxLength 为 maxLength 和 currentLength 中的较大值。

返回结果:

  • 遍历结束后,返回 maxLength,即最长无重复字符子串的长度。

你可能感兴趣的:(150道经典算法面试习题,javascript,开发语言,ecmascript)