题目描述

解题思路
- 本题采用双指针 + 哈希表的方式解决问题。
- 最大值是通过不断更新出来的。
- 右指针移动到字符串的最后一个元素循环结束。
- 循环体中首先判断右指针指向的元素是否出现在哈希表中,如果出现了,对应的值+1,反之赋值为1.
- 哈希表存在的意义就是为了辅助我们的左指针的移动,当右指针的元素出现的次数大于2,此时说明重复了,我们要不断移动左指针,直到右指针重复的这个元素不重复为止,移动左指针之前还要将左指针指向的这个元素的哈希值-1,防止后面出现了同样的元素
- 最后右指针右移,然后不断比较res和right - left的较大值赋给res。
解题代码
var lengthOfLongestSubstring = function(s) {
let left = 0;
let right = 0;
let res = 0;
let window = new Map();
while (right < s.length) {
if (window.has(s[right])) {
window.set(s[right],window.get(s[right]) + 1);
} else {
window.set(s[right],1);
}
while (window.get(s[right]) > 1) {
window.set(s[left],window.get(s[left]) -1);
left++;
}
right++;
res = Math.max(res,right - left);
}
return res;
};
参考链接
剑指Offer——最长不含重复字符的子字符串(JS实现)
总结(本题给我们的启示思路)
- 学会通过不断更新的方式获取最大值。
- 学会通过哈希表 + 双指针的方式来解决问题。