无重复字符的最长子串

刚刚开始写算法题,轻点喷

来题目献上 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

ini 复制代码
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

ini 复制代码
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

makefile 复制代码
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

第一次解答

来第一遍解答,也是我第一个想法

js 复制代码
/**
 * @param {string} s
 * @return {number}
 */
// 计算最长无重复字符子串的长度的函数
var lengthOfLongestSubstring = function (s) {
    // 将输入字符串转换为字符数组
    const arr = s.split('');
    // 初始化最大长度变量
    let max = 0;

    // 遍历数组中的每个字符
    for (let i = 0; i < arr.length; i++) {
        // 初始化用于子串遍历的第二个指针
        let j = i + 1;
        // 数组用于存储当前子串
        const str = [];
        // 将第一个字符添加到子串中
        str.push(arr[i]);

        // 只要字符不重复且第二个指针在数组范围内,就继续将字符添加到子串中
        while (!str.includes(arr[j]) && j < arr.length) {
            str.push(arr[j]);
            j++;
        }

        // 如果当前子串更长,则更新最大长度
        max = max > str.length ? max : str.length;
    }

    // 返回最长无重复字符子串的长度
    return max;
};

这个解题思路就是创建一个数组,只要这个字符在这个数组中不存在,就将这个字符添加进去,直到数组中已经有这个字符结束,然后将这个数组的长度记录跟之前的max值对比,选择大的记录,最后将这个max返回。

这种解法的时间复杂度为O(n^2),空间复杂度为O(n)。 所以提交结果是

第二次解答

来继续,让我们想想怎么优化。

js 复制代码
// 计算最长无重复字符子串的长度的函数
var lengthOfLongestSubstring = function (s) {
    // 使用哈希集合来记录当前窗口中的字符出现情况
    const set = new Set();
    // 指针p初始化为-1,相当于在字符串的左边界的左侧,还没有开始移动
    let p = -1;
    // 用于存储最长无重复字符子串的长度
    let max = 0;

    // 遍历整个字符串
    for (let i = 0; i < s.length; i++) {
        // 移除窗口的左侧字符
        if (i != 0) {
            set.delete(s.charAt(i - 1));
        }

        // 不断移动右侧指针,直到遇到重复字符或到达字符串末尾
        while (p + 1 < s.length && !set.has(s.charAt(p + 1))) {
            set.add(s.charAt(p + 1));
            p++;
        }

        // 更新最长无重复字符子串的长度
        max = Math.max(max, p + 1 - i);
    }

    // 返回最长无重复字符子串的长度
    return max;
};

这种解法的思路就是滑动窗口,创建一个哈希集合,移动指针,当这个集合中没有这个字符就加入哈希集合,可以保证在移动指针的时候这个哈希集合中一直是非重复的,当指针所移动到的字符哈希集合中有了就移动第一个指针(虚拟的,在这个里面的操作就是将哈希集合前面的字符串删除),直到p这个指针对应的字符在哈希集合中没有在进行添加操作,最后统计最大那个字符串。(优秀)

这种解法的时间复杂度为O(n),空间复杂度为O(min(n, m))。

相关推荐
鶴哥只手遮天1 小时前
Angular 22 源码级深度解析-第 02 章 编译链路总览:从模板字符串到 `ɵɵ` 指令
前端·开源·angular.js
尘世中一位迷途小书童1 小时前
别再堆万字 Prompt:用 Agent Skills 给团队写一个「前端 Review」Skill
前端·ai编程·cursor
aixingpan1 小时前
aixingpan.cn API开发文档:api_docs_bichart_common2接口指南
前端·php
super_Omni1 小时前
text/PDF/Word → 解析成纯文本 → 分词 → 词表匹配 → 加权打分 → 低于阈值
前端·chrome
阶进遐1 小时前
浏览器工具自制指南·对话导出(3):消息池设计
前端
SameX1 小时前
HarmonyOS 用 relationalStore 做阅读统计 App —— 5 张表背后的 5 个 schema 决策
前端
LV技术派1 小时前
【成为 AI Native Builder · 02】什么是 AI Native Builder:一个人 + AI,交付完整闭环
前端·程序员·ai编程
#麻辣小龙虾#2 小时前
网页布局css中flex+margin的组合布局技巧
开发语言·前端·javascript
叼烟扛炮2 小时前
Linux 学习笔记(四十五):Web 安全基石——Cookie、Session 与 HTTPS 原理解析
linux·前端·网络·笔记·学习·tcp/ip·安全
环境栈笔记2 小时前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化