给定一个字符串s,找出其中不含有重复字符的最长子串的长度

106 阅读1分钟
function lengthOfLongestSubstring(s) {
  let map = {};
  let left = 0;
  let max = 0;
  
  for (let right = 0; right < s.length; right++) {
    // 如果当前字符已经出现过,将左指针移动到之前出现过的位置的下一个位置
    if (map[s[right]]) {
      left = Math.max(left, map[s[right]]);
    }
    
    // 将当前字符的下标存储到 map 中
    map[s[right]] = right + 1;
    
    // 更新最大长度
    max = Math.max(max, right - left + 1);
  }
  
  return max;
}

该算法使用了滑动窗口的思想,通过两个指针 leftright 来扫描字符串,使用一个 map 来记录每个字符最后一次出现的位置。

具体的算法实现如下:

  • 初始化 map 和 left 指针为 0,max 为 0。
  • 遍历字符串,对于每个字符,判断其是否已经出现过:
    • 如果当前字符已经出现过,将左指针移动到之前出现过的位置的下一个位置。
    • 将当前字符的下标存储到 map 中。
    • 更新最大长度。
  • 返回 max。

时间复杂度为 O(n),空间复杂度为 O(min(m, n)),其中 n 为字符串的长度,m 为字符集的大小。