滑动窗口(Sliding Window)算法
##题目: 给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度。
**流程图
代码:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (arguments.length <= 0 || typeof s !== "string") {
return console.log("请输入字符串");
}
//定义一个哈希表(如 Map 或对象)记录每个字符上一次出现的位置
const map = new Map();
//定义两个指针模拟窗口的左右边界:left 表示窗口的左边界,right 表示窗口的右边界。
let left = 0,
right = 0;
//定义一个变量 maxLength 用于记录最长子串的长度。
let maxLength = 0;
// 遍历字符串: right指针是否越界
while (right < s.length) {
// 检查当前字符是否已经在哈希表中出现过。
if (map.has(s[right])) {
// 如果出现过,更新 left 指针为 当前字符在窗口左边最近一次出现的位置
// 让left左指针跳过那个重复字符,保证窗口内所有字符都不重复
left = Math.max(left, map.get(s[right]) + 1);
}
// right指针向右依次遍历字符串中的每一个字符 并且更新字符的最新位置到哈希表中。
// 设置键值对 map.set(key,value) key代表字符,value为该字符最近一次出现的索引
map.set(s[right], right);
// 实时更新当前找到的“最长无重复子串”的长度。
// 索引从0开始 长度从1开始 ===> 区间 [left, right] 的长度 = 右指针 - 左指针 + 1
maxLength = Math.max(maxLength, right - left + 1);
// 移动 right 指针到下一个字符。
right++;
}
return maxLength;
};
用例:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
执行过程: