考点:滑动窗口
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路
简单来说就是有左右两个指针,也即窗口的“边框”,它们括起了一个“窗口”。当窗口内没有重复字符的时候,右边界逐渐自增,当出现重复字符时,左边界一直挪到左边的重复字符的下一个字符位置。那么如何判断出现了重复字符呢?可以使用一个字典,存储每一位的下标。
var lengthOfLongestSubstring = function(s) {
let maxLen = 0; // 最大长度
const map = new Map(); // 储存
let left = 0, right = 0; // 左边界与右边界
while(right < s.length) { // 右边界没到最大长度
if(map.has(s[right])) { // 如果发现重复字符
// 注意!这里要取重复出现过的字符下标和左边界的较大值
// 要保证左边界一直是增加的
left = Math.max(map.get(s[right]) + 1, left);
}
// 储存右边界的下标
map.set(s[right], right);
// 如果当前窗口的长度已经超过最大值,则更新最大值
if(right - left + 1 > maxLen) maxLen = right - left + 1;
// 右边界挪一位
right++;
}
return maxLen;
};