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;
}
该算法使用了滑动窗口的思想,通过两个指针 left 和 right 来扫描字符串,使用一个 map 来记录每个字符最后一次出现的位置。
具体的算法实现如下:
- 初始化 map 和 left 指针为 0,max 为 0。
- 遍历字符串,对于每个字符,判断其是否已经出现过:
- 如果当前字符已经出现过,将左指针移动到之前出现过的位置的下一个位置。
- 将当前字符的下标存储到 map 中。
- 更新最大长度。
- 返回 max。
时间复杂度为 O(n),空间复杂度为 O(min(m, n)),其中 n 为字符串的长度,m 为字符集的大小。