无重复字符的最长字串

文章讲述了如何通过滑动窗口算法和JavaScriptSet数据结构求解给定字符串中无重复字符的最长子串长度。作者还介绍了Set和Map在JavaScript中的区别和用法示例。
摘要由CSDN通过智能技术生成

问题描述

题目:无重复字符的最长字串
给定一个字符串 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);
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值