【面试经典150 | 滑动窗口】无重复字符的最长子串

news2024/12/26 1:15:12

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:滑动窗口
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【双指针】【滑动窗口】【字符串】


题目来源

面试经典150 | 3. 无重复字符的最长子串


题目解读

本题题目要求明确,找出最长的子字符串的长度,该子字符串中没有重复的字符。

注意:子串指的是连续子串不是子序列。


解题思路

数据量为 5 × 1 0 4 5 \times 10^4 5×104,时间复杂度为 O ( n 2 ) O(n^2) O(n2) 的方法一定过不了,能过的一定是时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) 或者更小的方法。

方法一:滑动窗口

双指针的方法,left 维护无重复子串的起点,right 维护无重复子串的终点,初始时left=0right=-1。维护一个答案变量 res,初始 res=0

本题中,我们相对固定左指针 left,在当前左指针作为无重复字符的起点的情况下寻找可以到达的最远位置。

双指针从起点出发:

  • 如果遇到重复字符或者数组边界时,更新答案 res=max(res, right - left + 1)
  • 否则向右移动右指针,以 left 为起点的无重复字符找完之后,右移左指针。

实现上,可以用一个无序集合 st 辅助记录无重复的字符,当 st.find(c) == 1 时表示 c 在当前的字符串中了,否则将 c 放入无序集合中。当左指针移动时,需要移除左指针上一个指向位置的元素。

双指针的第一个指针的更新过程可以使用for循环代替while循环,并不会影响时间复杂度。

实现代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> set;
        int n = s.size();
        // rk是不包含重复字符的最长子串的结束位置
        int rk = 0, ans = 0;

        // 枚举左指针的位置
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                set.erase(s[i-1]);
            }

            while (rk < n && !set.count(s[rk])) {
                set.insert(s[rk]);
                ++rk;
            }
            ans = max(ans, rk - i); // 无重复的子串范围为 [i, rk-1]
        }
        return ans;
    }
};

复杂度分析

时间复杂度 O ( n ) O(n) O(n) n n n 为字符串的长度。

空间复杂度 O ( m ) O(m) O(m) m m m 为字符串中出现的无重复字符总数。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用git给github私有仓库上传文件

创建私有仓库可以参考这篇文章的前面7步&#xff1a; 关于Github私有仓库的创建 然后我想在私有仓库上传文件该怎么办呢&#xff1f; 在你的文件夹右键git bash 初始化git git init添加本地文件 git add .上传本地 git commit -m "first commit"设置branch&am…

NetSuite BOM成本查询

这是个23.2的新功能&#xff0c;如题所示是对BOM成本的一个查询工具&#xff0c;是对之前版本那个无用的“Costed Bill of Materials Inquiry”的一次救赎。 其重要的功能是&#xff1a; •基于BOM所使用的版本、工艺路线和成本模板&#xff0c;通过Break Down的方式计算一个装…

Spring学习笔记5 GoF之工厂模式

Spring学习笔记4 Bean的作用域_biubiubiu0706的博客-CSDN博客 出了GoF23种设计模式.还有javaee的设计模式(DAO模式,MVC模式) 设计模式:是一种可以被重复利用的解决方案 GoF23种设计模式可分为三大类: 创建型(5个):解决对象创建问题. 单例模式&#xff0c;工厂方法模式&#x…

18795-2012 茶叶标准样品制备技术条件

声明 本文是学习GB-T 18795-2012 茶叶标准样品制备技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了各类茶叶(除再加工茶)标准样品的制备、包装、标签、标识、证书和有效期。 本标准适用于各类茶叶(除再加工茶)感官品质…

2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析

​ 问题一 血肿扩张风险相关因素探索建模 思路&#xff1a; 根据题目要求,首先需要判断每个患者是否发生了血肿扩张事件。根据定义,如果后续检查的血肿体积比首次检查增加≥6 mL或≥33%,则判断为发生了血肿扩张。 具体判断步骤: (1) 从表1中提取每个患者的入院首次影像检查…

机器学习之监督学习,无监督学习,强化学习相关概念

文章目录 1. 监督学习&#xff08;Supervised Learning&#xff09;2. 无监督学习&#xff08;Unsupervised Learning&#xff09;3. 强化学习&#xff08;Reinforcement Learning&#xff09;总结 机器学习可以按照模型使用情况分为三大类&#xff1a;监督学习、无监督学习和强…

如何在电脑上配置多个JDK环境

一、说明 在项目开发过程中&#xff0c;可能会使用到多个JDK。那么如何让一台电脑上的配置JDK版本&#xff0c;并实现版本之间的切换&#xff0c;这就是今天要达到的目的。 二、配置过程 1、环境变量的配置 这里以JDK8和JDK17为例&#xff0c;来演示多个JDK版本之间的切换。安…

Spring面试题21:说一说Spring的@Required注解和@Qualifier注解

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的@Required注解 @Required ,用于标记在注入的属性上。它表示被注解的属性在配置 Bean 的时候是必需的,如果没有正确配置,则会抛出…

【owt】构建m79的owt-client-native:使用vs2017

家里电脑换成了台式机,拷贝代码发现了三年前的owt客户端mfc工程。 不用下载第三方库,试着构建下: owt-client-native 我这里有3年前的代码,思索了下还是用vs2017构建吧: 重新构建一下 选用x86 的 vs2017 vs的命令行控制台 cls可以清理屏幕 之前构建过vs2022的webrtc原版 …

Java基础常考知识点(基础、集合、异常、JVM)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; Java基础常考知识点…

算法-堆、队列、分治法-合并 K 个升序链表

算法-堆、队列、分治法-合并 K 个升序链表 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/merge-k-sorted-lists 1.2 题目描述 2 题解 2.1 队列 2.1.1 解题思路 将各个有序子链表放入队列&#xff0c;两两合并&#xff0c;最后队列中剩的最后的子链表就是合并后…

【湖科大教书匠】计算机网络随堂笔记第3章(计算机网络数据链路层)

目录 3.1、数据链路层概述 概述 网络中的主机、路由器等都必须实现数据链路层 局域网中的主机、交换机等都必须实现数据链路层 从层次上来看数据的流动 仅从数据链路层观察帧的流动 数据链路层使用的信道 三个重要问题 封装成帧 差错控制 ​编辑可靠传输 3.2、封装成帧 介绍…

Redis客户端

文章目录 一、scan命令二、数据库管理命令三、RESP协议四、string类型五、list类型六、set类型七、hash类型八、zset类型 一、scan命令 keys是一次性把整个redis中所有的key都获取道&#xff0c;这个操作比较危险&#xff0c;可能会一下子得到大量的key&#xff0c;阻塞redis服…

009_第一代软件开发(一)

第一代软件开发(一) 文章目录 第一代软件开发(一)项目介绍借鉴前辈UI传统QWidget OR QML建立远程仓库&#xff0c;并拉取至本地 关键字&#xff1a; Qt、 Qml、 git、 版本控制、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#x…

设计模式再探——原型模式

目录 一、背景介绍二、思路&方案三、过程1.原型模式简介2.原型模式的类图3.原型模式代码4.原型模式深度剖析5.原型模式与spring 四、总结五、升华 一、背景介绍 最近在做业务实现的时候&#xff0c;为了通过提升机器来降低开发人员的难度和要求&#xff0c;于是在架构设计…

RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列

目录 一、惰性队列 1.1、消息堆积问题 1.2、消息堆积问题的解决方法 从消费者的角度&#xff1a; 从队列的角度&#xff1a; 1.3、引入惰性队列 1.3.1、什么是惰性队列 1.3.2、惰性队列的使用 1.3.3、效果演示 一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度…

leetcodeTop100(21) 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xff0c;链表必须 保持其原始结构 。 双链表…

1:DDD入门

产品代码都给你看了&#xff0c;可别再说不会DDD&#xff08;一&#xff09;&#xff1a;DDD入门 # 这是一个讲解DDD落地的文章系列&#xff0c;作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云&#xff08;https://www.mryqr…

【车载开发系列】UDS中Bootloader实现原理

【车载开发系列】UDS中Bootloader实现原理 【车载开发系列】UDS中Bootloader实现原理 【车载开发系列】UDS中Bootloader实现原理一. Bootloader存放位置二. BootLoader的安全机制1&#xff09;安全访问2&#xff09;刷新预条件3&#xff09;完整性校验4&#xff09;一致性检查5…

NextJS 引入 Ant-Design 样式闪烁问题

按照这里给的样例&#xff0c;抽出关键代码即可 步骤&#xff1a; 安装包&#xff1a; npm i ant-design/static-style-extract引入这俩文件 genAntdCss.tsx: 会帮我们生成 ./public/antd.min.css // src/scripts/genAntdCss.tsximport { extractStyle } from "ant-d…