问题描述
题目:无重复字符的最长字串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解题思路
这道题可以采用 滑动窗口
的方法来做,从左往右,将每一个字符作为子串的开始字符,用左指针来表示,再设置一个右指针,去统计能够得到含最长无重复字符的子串。假如此时左指针是下标为0的字符,右指针从0开始。如果当前右指针的加入不产生重复字符,继续将右指针往后移;若是重复字符,说明以当前左指针开始的无重复子串已找到。将左指针右移,统计以下一个字符为起始字符的子串含最长无重复字符的数量,右指针还是从上一次的位置开始,这样依次循环。
判断重复可以用 Set
来做。 在左指针向右移动的时候,可以从 Set
中移除一个字符,在右指针向右移动的时候,我们往 Set
中添加一个字符。
具体实现见以下代码。
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let n = s.length;
if(n === 0 || n === 1) return n;
let res = 0;
const set = new Set();
let end = 0
for(let i = 0; i < n; i++) {
while(end < n) {
if(!set.has(s[end])) {
set.add(s[end]);
end++;
}
else break;
}
res = Math.max(res, set.size);
set.delete(s[i]);
}
return res;
};
JS扩展:Set 和 Map
Set
和 Map
是 ES6
引入的两种新的数据结构。 Set
是一种叫做集合的数据结构, Map
是一种叫做字典的数据结构。
-
相同点
集合、字典都可以存储不重复的值。Map
的键和Set
的值都是唯一的。在Set
中,每个值都只能出现一次;在Map
中,每个键都只能对应一个值;
Set
和Map
都保持元素的插入顺序。这意味着当你遍历它们时,元素会按照它们被添加的顺序出现。 -
区别
Set
是以 [值,值] 的形式存储元素,Map
是以 [键,值] 的形式存储;
Set
在检查值是否存在时通常比Map
快,因为它只需要比较值;
Map
在通过键获取值时通常更快,因为它使用哈希表来存储键值对;
Set
接受一个一维数组做参数,可以像数组一样配合扩展运算符使用。Map
接受二维数组作为参数;
Map
的 get 方法和 set 方法配合使用,例如:
//Map 的使用注意事项
const m = new Map()
m.set(1, 'zhu')
m.set(undefined, 'zhu')
console.log(m.get(1))
console.log(m.get(undefined))
//不能使用m[1]='zhu',这代表为对象添加属性,而不是向Map里面增添键值对,也不能使用m[1]来获取值
//Map 的遍历方法
const map = new Map([
['1', 'zhu'],
['2', 'hao'],
]);
for (let key of map.keys()) {
console.log(key);
}
for (let value of map.values()) {
console.log(value);
}
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "1" "zhu"
// "2" "hao"
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value);
}
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}