当前位置: 首页 > news >正文

【JS】使用滑动窗口得到无重复字符的最长子串

题目

 思路

  • 本题采用滑动窗口思想,定义左右指针作为滑动窗口的边界,使用Set数据结构处理重复字符,需要注意的是:每次遍历时采用Math.max方法实时更新最长子串的长度;当左指针移动时,set要删除对应字符。

步骤

  1. 初始化:定义变量 maxLen 用于记录无重复字符的最长子串的长度,初始值为 0;定义变量 left 作为滑动窗口的左边界,初始值为 0;创建一个 Set 数据结构 charSet 用于存储当前滑动窗口内的字符,利用 Set 的元素唯一性来判断字符是否重复。
  2. 遍历字符串:通过 for 循环遍历字符串 sright 作为滑动窗口的右边界。
  3. 处理重复字符:当发现 charSet 中已经存在当前字符 s[right] 时,说明出现了重复字符。此时通过 while 循环不断移动滑动窗口的左边界 left,并从 charSet 中删除对应的字符,直到窗口内不再有重复字符。
  4. 添加字符并更新长度:将当前字符 s[right] 添加到 charSet 中,然后更新 maxLen,取当前 maxLen 和当前窗口长度(right - left + 1)中的较大值。
  5. 返回结果:遍历结束后,maxLen 即为无重复字符的最长子串的长度,将其返回。

示例代码

var lengthOfLongestSubstring = function(s) {
    // 用于存储无重复字符的最长子串的长度,初始值为0
    let maxLen = 0;
    // 滑动窗口的左边界索引,初始值为0
    let left = 0;
    // 使用Set数据结构来存储当前滑动窗口内的字符,Set的特性是元素唯一
    let charSet = new Set();
    // 遍历字符串s,right作为滑动窗口的右边界索引
    for (let right = 0; right < s.length; right++) {
        // 如果当前字符已经在Set中,说明有重复,需要移动left指针来缩小窗口
        // 直到窗口内不再有重复字符
        while (charSet.has(s[right])) {
            // 从Set中删除滑动窗口左边界对应的字符
            charSet.delete(s[left]);
            // 左边界右移一位
            left++;
        }
        // 将当前字符加入Set,此时窗口内无重复字符
        charSet.add(s[right]);
        // 更新最长子串的长度,取当前记录的最长长度maxLen和当前窗口长度(right - left + 1)中的较大值
        maxLen = Math.max(maxLen, right - left + 1);
    }
    // 返回无重复字符的最长子串的长度
    return maxLen;
};

欢迎指正!

相关文章:

  • Linux系统高级IO
  • 还是主题混合程序设计
  • Redash:一个开源的数据查询与可视化工具
  • 如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析
  • YOLOv12 训练从这里开始:LabelImg 标注数据集
  • 详解 MySQL 索引的最左前缀匹配原则
  • 【C语言】内存函数
  • SQLark(百灵连接):一款面向信创应用开发者的数据库开发和管理工具
  • 一周学会Pandas2 Python数据处理与分析-NumPy数组创建
  • 网络建设与运维神州数码DCN 基于流的重定向
  • LVGL修改标签文本,GUI Guider的ui不生效
  • 实验研究:不同物体与落点材质对弹起高度的影响
  • app逆向专题一:如何下载app
  • 【C++】多线程编程大礼包
  • Java 责任链模式 详解
  • 初阶数据结构--树
  • 第五章、 虚拟内存
  • PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限
  • 2140. 解决智力问题
  • Java导出excel,表格插入pdf附件,以及实现过程中遇见的坑