专题二 - 滑动窗口 - leetcode 3. 无重复字符的最长子串 | 中等难度

leetcode 3. 无重复字符的最长子串

  • leetcode 3. 无重复字符的最长子串 | 中等难度
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

leetcode 3. 无重复字符的最长子串 | 中等难度

1. 题目详情

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

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

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

1. 原题链接

leetcode 3. 无重复字符的最长子串

2. 基础框架

● Cpp代码框架

class Solution {
public:int lengthOfLongestSubstring(string s) {}
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 本题要求字符串s的最长连续不重复子串。子串其实与子数组是相似的概念。
( 2 ) (2) (2)

2. 算法原理

( 1 ) (1) (1) 首先想到暴力枚举,枚举出所有子串,记录连续不重复子串的长度,在其中找出最大的。
首先固定一个起始位置i,枚举以i为开始位置的子串:
如果满足新元素加入后满足题意,长度len就自增1;
如果不满足就说明以i为开始位置的子串在新元素及其之后的所有元素都不满足题意,即出现重复元素了。所以可以直接开始枚举以i+1为开始位置的子串了。
这里判断新元素是否在子串中出现不能通过在子串中搜索实现,这样时间复杂度很高。优化方法是:遍历子串时使用哈希数组hash记录对应字符元素出现的次数,这样在判断新元素是否重复时只要查询一下hash中字符元素出现的次数即可,是O(1)操作。
( 2 ) (2) (2) 对暴力枚举的再优化:滑动窗口
我们先来看一个暴力枚举时的例子:
在这里插入图片描述
( 3 ) (3) (3) 通过对减少暴力枚举中重复的遍历,优化时间复杂度。

3. 时间复杂度

暴力枚举 O ( n 2 ) O(n^2) O(n2)

滑动窗口 O ( n ) O(n) O(n)

滑动窗口算法中leftright都只向一个方向移动,不会回退,直到结束最坏情况是left都和right移动到末尾,时间复杂度也是 O ( n ) O(n) O(n)级别

3. 代码实现

class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0;int hash[128];//哈希数组记录滑动窗口内元素出现的个数int l = 0, r = 0;while(r < s.size()){hash[s[r]]++;//进窗口while(hash[s[r]] > 1)//判断hash[s[l++]]--;//"滚出" 窗口ret = max(ret, r - l + 1);//更新结果r++;//让}return ret;}
};

4. 知识与收获

( 1 ) (1) (1) 滑动窗口是对暴力枚举思路的优化,在理解暴力枚举的思路下,发现暴力枚举中进行着大量重复的遍历操作,通过设法(同向双指针,right不回退)避免进行重复的操作,降低一个维度的时间复杂度。


T h e The The E n d End End

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

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

相关文章

【Java】深入解析Java中的多态性:理解方法的重写和重载

在Java编程中&#xff0c;多态性是一种重要的概念&#xff0c;它允许我们以一种通用的方式处理不同类型的对象&#xff0c;从而增强了代码的灵活性、可扩展性和可维护性。多态性的实现主要通过方法的重写和重载&#xff0c;在本文中我们将深入探讨这两种机制的原理、使用方法以…

运营商关注焦点访谈:如何将裸光纤资源价值最大化?

引言 当遇见裸光纤租赁业务&#xff0c;运营商如何合理规划、分配纤芯资源&#xff1f;相信这是每个运营商伙伴都遇见过的问题。我们经过多用户调研访谈&#xff0c;发现规划与分配并不难&#xff0c;真正的难点在于将这些哑资源、暗资源“合理规划与分配”&#xff0c;合理才…

公众号如何获取视频号下载工具?

视频内容已经成为信息传播的重要载体&#xff0c;微信视频号作为国内主流的短视频平台之一&#xff0c;深受用户喜爱。有时我们想要保存喜欢的视频以供日后观看&#xff0c;这时就需要借助一些公众号提供的视频号下载工具。 本文将详细解析如何利用这些工具&#xff0c;让你轻…

【C++从练气到飞升】02---初识类与对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、面向过程和面向对象初步认识 二、类的引用 1. C语言版 2. C版 三、类的定义 类的两种定义方式&#xff…

P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录 思路 代码 题目链接&#xff1a; P8680 [蓝桥杯 2019 省 B] 特别数的和 思路 最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数&#xff0c;字符串很容易做到这一点&#xff0c;只是在数字相加这一步不好实现。 需要用到字符串与数字的…

【Python从入门到进阶】50、当当网Scrapy项目实战(三)

接上篇《49、当当网Scrapy项目实战&#xff08;二&#xff09;》 上一篇我们讲解了的Spider与item之间的关系&#xff0c;以及如何使用item&#xff0c;以及使用pipelines管道进行数据下载的操作&#xff0c;本篇我们来讲解Scrapy的多页面下载如何实现。 一、多页面下载原理分…

【竞技宝】LOL:TES连下两局轻松击败OMG

【竞技宝】LOL&#xff1a;TES连下两局轻松击败OMG 北京时间2024年3月9日&#xff0c;英雄联盟LPL2024春季常规赛继续进行&#xff0c;昨日共进行三场比赛&#xff0c;第三场比赛由TES对阵OMG。本场比赛&#xff0c;TES的打野选手tian个人表现出色&#xff0c;两局比赛都多次成…

pyqt线程正确使用

PyQt之科学使用线程处理耗时任务以及线程通信方法 上面这篇文章看似很科学… 经过实际测试&#xff0c;需要按下面创建线程&#xff1a; self.work EmailWork() self.thread QtCore.QThread() self.thread.start()self.work.moveToThread(self.thread) self.work.complete_…

案例分析01-题型分析与历年案例题真题考点汇总(2024年软考高级系统架构设计师冲刺知识点总结)

1、历年真题案例分析题考点汇总 1.1 2018年~2023年 1.2 2012年~2017年 2、考试安排 案例分析题的考试安排在下午,时间为1.5小时,相对来说比较轻松。 上午:09:00-11:30,150分钟,2.5小时 综合知识题,全选择题,单选题 75个空,75分,45分合格 下午:13:30-15:00,90分钟,…

小邦教你4步解决下属把你投诉快速的转祸为福

​​在日常的工作中&#xff0c;无论你做得有多么优秀&#xff0c;有多么的完美&#xff0c;有多么的完善&#xff0c;难免还有漏洞之处。甚至说你的一个不经意&#xff0c;你的一个不小心&#xff0c;导致了比较坏的结果。正当你绞尽脑汁、头痛的时刻&#xff0c;却被有心的员…

ODP(Open Data Plane)

1. 摘要 本文档旨在指导新的ODP应用程序开发人员。 有关ODP的更多详细信息&#xff0c;请参见 ODP 主页。 Overview of a system running ODP applications ODP是一份API规范&#xff0c;为高性能网络应用程序的实现提供平台独立性、自动硬件加速和CPU扩展。 本文档介绍如何充…

数据结构 - 堆

这篇博客将介绍堆的概念以及堆的实现。 1. 堆的定义&#xff1a; 首先堆的元素按照是完全二叉树的顺序存储的。 且堆中的某个节点总是不大于或不小于其父节点的值。 根节点最大的堆叫做大堆&#xff0c;根节点最小的堆叫小堆。逻辑结构如下图所示&#xff1a; 大堆和小堆的…

学校Java的第七天

目录 一、什么是数组 二、作用 三、如何使用数组 1、声明数组变量 2、创建数组 示例&#xff1a; 3、数组的使用 示例&#xff1a; 4、数组的遍历 for循环示例&#xff08;不知道for循环的可以查看我之前发的文章&#xff09; for-each循环&#xff08;也就是增强for…

co_await(下)

有栈协程和无栈协程 有栈协程和无栈协程 实现一个协程的关键点在于如何保存、恢复和切换上下文&#xff0c;而这也是有栈协程和无栈协程的主要区别。有栈协程通过直接切换堆栈来实现&#xff0c;其构造了一个内存中的栈&#xff0c;而无栈协程使用状态机按需分配的方式&#x…

sqlite 损坏 修复

步骤1 SQLite Download Page下载sqlite3 对应的系统版本 2.参考怎么恢复sqlite 数据库文件✅ - 有乐数据恢复网 sqlite3 dbname > .mode insert > .output dbdump.sql > .dump > .exit 恢复方法1 1.创建一个新的数据库 例如名字叫 test.db 2sqlite3 test.…

Rust 泛型使用过程中的 <T> 和 ::<T> 的区别

Rust 的泛型语法中&#xff0c;<T> 和 ::<T> 有不同的用途和上下文&#xff0c;但它们都与泛型有关。 <T> 在类型定义中 当你在定义函数、结构体、枚举或其他类型时&#xff0c;使用 <T> 来表示泛型参数。例如&#xff1a; fn identity<T>(x:…

将props展平传到DOM上(二)

当我们将展平&#xff08;传播&#xff09;的属性设置子组件时&#xff0c;我们会引入风险&#xff0c;因为我们可能会往 HTML 标签上添加它不支持的属性。 坏实践 下面这个例子会在 DOM 元素上增加一个该元素本身不支持的属性flag。 const Sample () > (<Spread flag…

k8s中的PV和PVC存储介绍

目录 一.PV介绍 1.含义 2.关键配置参数 二.PVC介绍 1.含义 2.关键参数配置 三.PV和PVC的生命周期问题 1.PV的生命周期会有4个阶段 2.用户申请空间PV的周期流程 3.PV和PVC的使用/释放/回收 四.案例演示 1.NFS配置 2.新建PV 3.新建PVC 4.新建Pod测试 5.模拟删除P…

极狐GitLab 16.1 重点功能解读,更好的 DevOps 体验如约而至【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 极狐GitLab 在去年 6 月份发布了 16.1 版本。此次发布带来了全…

Linux虚拟机安装Redis

官网下载压缩包&#xff1a;官网链接&#xff0c;然后将对应的tar.gz压缩包放入虚拟机下的/opt目录下。由于redis是C语言开发的&#xff0c;因此需要安装gcc编译器来编译代码&#xff0c;我们下载的压缩包里面是源代码&#xff0c;需要编译。通过yum install gcc指令下载C语言的…