【LeetCode刷题笔记(9-1)】【Python】【无重复字符的最长子串】【滑动窗口】【中等】

文章目录

  • 引言
  • 无重复字符的最长子串
    • 题目描述
    • 提示
  • 解决方案1:【滑动窗口】
  • 结束语

无重复字符的最长子串

引言

编写通过所有测试案例的代码并不简单,通常需要深思熟虑理性分析。虽然这些代码能够通过所有的测试案例,但如果不了解代码背后的思考过程,那么这些代码可能并不容易被理解和接受。我编写刷题笔记的初衷,是希望能够与读者们分享一个完整的代码是如何在逐步的理性思考下形成的。我非常欢迎读者的批评和指正,因为我知道我的观点可能并不完全正确,您的反馈将帮助我不断进步。如果我的笔记能给您带来哪怕是一点点的启示,我也会感到非常荣幸。同时,我也希望我的分享能够激发您的灵感和思考,让我们一起在编程的道路上不断前行~

无重复字符的最长子串

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

  • 输入: s = “pwwkew”
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

提示

  • 答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

解决方案1:【滑动窗口】

根据题意,解决问题的关键是如何在字符串 s找到其中不含有重复字符最长子串长度。且根据提示,【子串】必须是索引连续的字符串。当脑海中没有明确idea时,分析示例可能会带来灵感~

  • 在示例3,字符串s="pwwkew",当我们从左往右遍历字符串时,遇到的第一个不含有重复字符的子串是"pw",此时最长子串长度max_len=2;随后,当遍历到第三个字符"w"时,出现了重复,此时应该舍弃"pw",从第三个字符"w"为起点,重新寻找第二个不含有重复字符的子串"wke", 此时最长子串长度max_len=3;最后,当遍历到最后一个字符"w"时,此时应该舍弃子串"wke"中的"w",让"ke"和最后一个字符"w"组成最后一个不含有重复字符的子串是"kew", 此时最长子串长度max_len=3

从示例3中,我们可以总结出以下规律:

  • 首先,我们需要选择一种能够方便获取元素长度数据结构存储当前“子串”,以便获取其长度来及时更新max_len
  • 其次,这种数据结构应具备查找元素的功能,以便判断新元素是否存在于当前子串中。
    • 若新元素存在当前子串 ⇒ 即将出现重复元素,如示例三的新元素"w"和当前子串"wke" ⇒ 需要先舍弃子串"wke"中的第一个元素"w",而这个被舍弃的"w"也是首先进入这种数据结构的字符 ⇒ 需要一种能够实现“先进先出”的数据结构 ⇒ 利用【队列】存储子串,当舍弃掉队列头部的"w"后,再把新的"w"添加到队列的尾部,组成新的子串"kew"
    • 若新元素不存在当前子串 ⇒ 直接把新元素添加到队列尾部即可。

问题1:在python中,什么数据对象可以实现【队列】这种数据结构?

列表

问题2:上面叙述的流程有没有一个约定俗成的算法名称?

有!滑动窗口法

由于队列中的元素个数是随着遍历字符串s不断增加/删除的,且队列的长度也在不断发生变化 ⇒ 我们可以将队列想象成一个不定长窗口,在字符串s上按照从左往右的顺序进行滑动滑动窗口法

完整代码如下

class Solution:  
    def lengthOfLongestSubstring(self, s: str) -> int:  
        # 用列表对象初始化一个空队列  
        queue = []  
        # 初始化最大长度为0  
        max_len = 0  
        # 遍历字符串s的每个字符  
        for c in s:  
            # 如果当前字符在队列中 ---> 出现重复
            while c in queue:  
                # 从队列的头部不断删除字符,直到当前字符不存在于队列中  
                queue.pop(0)  
            # 由于当前字符不存在于队列中,将当前字符添加到队列尾部
            queue.append(c)  
            # 如果队列的长度大于最大长度  
            if len(queue) > max_len:  
                # 更新最大长度为队列的长度  
                max_len = len(queue)  
        # 返回最大长度  
        return max_len
        

运行结果
在这里插入图片描述
问题3:从运行结果来看,似乎还有很大的优化空间,可以从哪些方面入手优化呢?

  1. 换一个查找速度更快的数据结构存储“子串”。

由于当前队列是基于列表进行实现的,而列表中查找元素的时间复杂度是O(n)。有没有查找元素的时间复杂度更低的数据结构,并且也能实现队列?

有!基于哈希表的集合对象set(),但需要额外的变量进行辅助。

完整代码如下

class Solution:  
    def lengthOfLongestSubstring(self, s: str) -> int:  
        # 如果字符串为空,返回0  
        if not s:  
            return 0  
          
        # 初始化变量  
        n = len(s)  
        look_up = set()  # 用于存储当前子字符串
        cur_len = 0  # 当前子字符串的长度  
        max_len = 0  # 最长子字符串的长度  
        left = 0  # 滑动窗口的左边界  
  
        # 遍历字符串  
        for i in range(n):  
            # 如果当前字符在已出现的字符集中,则需要移动左边界并缩小当前子字符串的长度  
            while s[i] in look_up:  
                look_up.remove(s[left]) # 队列移除头部元素,left指向的就是头部元素所在位置 
                cur_len -= 1  
                left += 1  
              
            # 将当前字符添加到字符集中,并增加当前子字符串的长度  
            look_up.add(s[i])  
            cur_len += 1  
              
            # 如果当前子字符串的长度大于最长子字符串的长度,则更新最长子字符串的长度  
            if cur_len > max_len:  
                max_len = cur_len
      
        # 返回最长子字符串的长度  
        return max_len

运行结果
在这里插入图片描述
问题4:从运行结果来看,已经有一定程度的优化,还能在进一步优化吗?

  1. 当最大无重复子串长度max_len已经大于当前子串长度cur_len和字符串s尚未遍历的元素个数n-i之和时,可以提前终止遍历,并返回结果。

完整代码如下

class Solution:  
    def lengthOfLongestSubstring(self, s: str) -> int:  
        # 如果字符串为空,返回0  
        if not s:  
            return 0  
          
        # 初始化变量  
        n = len(s)  
        look_up = set()  # 用于存储已经出现过的字符  
        cur_len = 0  # 当前子字符串的长度  
        max_len = 0  # 最长子字符串的长度  
        left = 0  # 滑动窗口的左边界  
  
        # 遍历字符串  
        for i in range(n):  
            # 如果当前字符在已出现的字符集中,则需要移动左边界并缩小当前子字符串的长度  
            while s[i] in look_up:  
                look_up.remove(s[left])  
                cur_len -= 1  
                left += 1  
              
            # 将当前字符添加到字符集中,并增加当前子字符串的长度  
            look_up.add(s[i])  
            cur_len += 1  
              
            # 如果当前子字符串的长度大于最长子字符串的长度,则更新最长子字符串的长度  
            if cur_len > max_len:  
                max_len = cur_len

			# 最大无重复子串长度max_len已经大于等于当前子串长度cur_len和字符串s尚未遍历的元素个数n-i之和时,退出for循环
            if cur_len + (n-i) <= max_len:
                break  
      
        # 返回最长子字符串的长度  
        return max_len

运行结果
在这里插入图片描述
复杂度分析

  • 时间复杂度:O(N),其中 N 是字符串s元素的数量。
  • 空间复杂度:参考官方题解

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

七轴开源协作机械臂myArm视觉跟踪技术!

引言 ArUco标记是一种基于二维码的标记&#xff0c;可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择&#xff0c;特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术&#xff0c;使用ArUco标记的机械臂系统…

爬虫国密加密案例:某医保服务

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw/Y29…

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

adb: error: cannot create file/directory ‘d:/1.png‘: No such file or directory

将文件从设备读取到PC 由于权限问题&#xff0c;不能直接pull到电脑磁盘根目录&#xff0c;否则会报错&#xff1a; adb pull <remote> <local> eg: C:\Users\admin>adb pull /sdcard/server.log C:\Users\admin\Desktop /sdcard/server.log: 1 file pulled.…

AI创作系统ChatGPT网站源码,支持AI绘画,支持GPT语音对话+智能思维导图生成

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

客观题测试-第7章查找

第1关&#xff1a;查找客观题测试&#xff08;一&#xff09; 1、关键字可以唯一地标识一个数据元素。 A、对 B、错 2、二叉排序树是一个动态查找表。 A、对 B、错 3、如果顺序表中各元素的查找概率相同&#xff0c;在顺序查找时&#xff0c;查找不成功的平均查找长度因…

nodejs微信小程序+python+PHP国漫推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

TrustZone之其他设备及可信基础系统架构

一、其他设备 最后,我们将查看系统中的其他设备,如下图所示: 我们的示例TrustZone启用的系统包括一些尚未涵盖的设备,但我们需要这些设备来构建一个实际的系统。 • 一次性可编程存储器(OTP)或保险丝 这些是一旦写入就无法更改的存储器。与每个芯片上都包含相同…

【Vue2】Component template should contain exactly one root element.

问题描述 [plugin:vite:vue2] Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.原因分析 这个错误通常是由于 Vue 组件的模板中包含多个根元素导致的。Vue 要求组件模板中只…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12&#xff08;一个标准但小规…

13.FTP

FTP FTP配置 添加一个本地用户 设置个密码 服务类型是FTP 工作路径授权给用户 设置用户角色为网络管理员 开启FTP服务 R2的路径下有这些文件 在R1进行测试&#xff0c;输入刚才创建的用户密码 get 获取文件 put上传文件 也可以在PC进行访问 可以升级路由器系…

阅览窗格功能虽然便利,但有时会出错,特别是在Word和Excel文件中更为常见

当你打开预览窗格功能时&#xff0c;每次你打开Windows文件资源管理器并选择任何文件&#xff0c;你将在屏幕的右窗格上看到该文件的小预览缩略图。 由于这个新功能&#xff0c;你可以在Windows资源管理器的右窗格上以缩略图的形式看到文件的小预览。此功能在更快地识别文件方…

SVN小白常见操作流程

SVN小白常见操作流程 一、什么是Subversion&#xff1f;二、TortoiseSVN客户端安装教程三、SVN 操作3.1 SVN Ckeckout(检出)3.2 Add(新增文件)3.3 SVN Commit(提交)3.4 SVN Update(更新操作)3.5SVN Delete(删除操作)3.6 SVN Revert to a revision(版本回溯)3.7 不同版本内容之间…

三大主流前端框架介绍

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…

「新版」PyCharm 加载condav Environment / Conda executableis not found

在新版的 PyCharm 配置中&#xff0c;设置Conda环境不再与旧版本保持一致&#xff0c;对于新手而言可能不清楚如何加载&#xff0c;作者也是郁闷了好久&#xff0c;经过一顿输出发现需要通过加载conda配置&#xff0c;才调取conda虚拟环境&#xff0c;而不再是直接调取conda的虚…

06_Web框架之Django三

Web框架之Django三 学习目标和内容 1、能够通过ORM模型创建数据表 2、能够通过ORM模型对数据进行操作 3、能够理解ORM模型对应关系 一、ORM概念 1、ORM介绍 对象关系映射 用于实现面向对象编程语言里不同类型系统数据之间的转换。 其就是使用面向对象的方式&#xff0c;操作…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差&#xff0c;不利于在不同规模的数据集上有效运行若输入维度发生变化&#xff0c;需要修改并重新训练网络容易过拟合 全连接导致参数量特别多&#xff0c;容易过拟合如果增加更多层&#xff0c;参数量会翻倍无法有效利用局部特征 输入…

EnvoyFilter API

目录 原文链接 https://onedayxyy.cn/docs/EnvoyFilter-API 本节实战 实战名称&#x1f6a9; 实战&#xff1a;EnvoyFilter API-全局范围-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a;EnvoyFilter API-配置优先级-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a…