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