- 用双指针维护一个滑动窗口,用来剪切子串。
- 不断移动右指针,直到遇到重复字符的时候把左指针移到前面的重复字符的下一位。(相当于把前面的重复字符删除)
- 移动指针过程中,记录窗口长度的最大值即为答案。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
// 定义一个左指针
let left=0
// 定义一个结果
let res=0
// 存放字符和下标
let map=new Map()
for(let i=0;i<s.length;i++){
// 判断是否出现重复字符串,进入判断的重复的字符串必须是位于左指针的右边
if(map.has(s[i]) && map.get(s[i])>=left){
// 左指针移到重复出现的字符串的下一位
left=map.get(s[i])+1
}
res=Math.max(res,i-left+1)
// 存下每个字符的下标
map.set(s[i],i)
}
return res
};
在判断是否是重复字符的时候,别忘了加上 满足重复字符的索引大于左指针(&& map.get(s[r]) >= left) 这个附加条件,不然就会出错。比如 abbcdea这个 意外,在遍历到最后一个字符 a 的时候,如果没有加上这个条件,最后一个 a 也会被认为是重复字符,从而产生错误。