思路
1.双指针维护一个滑动窗口
2.左右指针都在同一起始位置(0),右移右指针,遇到重复字符就移动左指针到重复字符(前面)的下一位
3.记录索引窗空长度,返回最大值
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
//左指针
let l = 0;
//记录长度
let res = 0;
//存储无重复的子串
const map = new Map();
//r:右指针
for (let r = 0; r < s.length; r++) {
if(map.has(s[r]) && map.get(s[r]) >= l){
l = map.get(s[r]) + 1;
}
//找到最大的窗口长度
res = Math.max(res, r - l + 1);
map.set(s[r],r);
}
return res
};
复杂度
时间:O(n):1个for循环
空间: O(n);n:不重复字符的个数