LeetCode_3_中等_无重复字符的最长子串

文章目录

  • 1. 题目
  • 2. 思路及代码实现(Python)
    • 2.1 窗口滑动
    • 2.2 基于哈希表的窗口滑动


1. 题目

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

示例 1:

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

示例 2:

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

示例 3:

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

字符串中任意个连续的字符组成的子序列称为该串的子串。


提示

  • 0 < = s . l e n g t h < = 5 ∗ 1 0 4 0 <= s.length <= 5 * 10^4 0<=s.length<=5104
  • s 由英文字母、数字、符号和空格组成

2. 思路及代码实现(Python)

题解来源:力扣官方题解

2.1 窗口滑动

寻找字符串中不含重复字符的最长字串,一个很直观的方法是找到无重复字符的所有子串,其中最长的子串即为所求。

这里官方题解中用了一个双指针的方法,左指针表示字串的起始位置 k k k,右指针表示从当前左指针开始得到的最长无重复字符的子串的结束位置 r k r_k rk。这里值得注意的是,当我们从 k k k 位置开始,找到了一个无重复字符的最长子串,其结束位置在 r k r_k rk,则当我们滑动左指针到 k + 1 k+1 k+1 时,左指针到 r k r_k rk 之间仍然是无重复字符的子串。利用这个规律可以减少双指针窗口滑动过程的判断次数。

在Python当中,判断是否包含重复值可以用列表list、集合set等存储无重复字符,这里常用哈希集合set。在“窗口滑动”这个思路当中,右指针是一直递增的,而左指针也一直往右滑动,两个指针都只滑动一遍整个字符串,相当于每层循环乘以的系数之和为 n n n,时间复杂度为 O ( n ) O(n) O(n),而空间复杂度为存储的无重复字符的子串,在最差情况下,存储了问题的字符集的全部元素。

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ = set()n = len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动rk, ans = -1, 0for i in range(n):	# 左指针if i != 0:# 左指针向右移动一格,移除一个字符occ.remove(s[i - 1])while rk + 1 < n and s[rk + 1] not in occ:# 不断地移动右指针occ.add(s[rk + 1])rk += 1# 第 i 到 rk 个字符是一个极长的无重复字符子串ans = max(ans, rk - i + 1)return ans

执行用时:244 ms
消耗内存:17.02 MB

2.2 基于哈希表的窗口滑动

上面的双指针的操作很直观,也很简单实现,但是大家有没有发现,当双指针窗口滑动的时候,碰到一个新的重复字符时,并不知道新的重复字符在原来子串当中的位置,所以只能将左指针一格格地往右移动。

例如:字符串“abcdc”,当取到 “abcd” 子串时,右指针滑动到最后一位 “c” 时,判断得到该字符在已有子串中,但是不知道具体位置,所以左指针需要从“a” 移动到 “b” 再到 “c”,而如果能直接存储每个字符的上一次出现的位置,则在新增重复字符时,直接将左指针移动到上一次出现的位置,减少了左指针的遍历次数。

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:max_len, hashmap = 0, {}# 定义窗口的首尾端 (start, end), 然后滑动窗口start = 0for end in range(len(s)):# 存储字符的出现频率,并更新子串最大长度hashmap[s[end]] = hashmap.get(s[end], 0) + 1if len(hashmap) == end - start + 1:max_len = max(max_len, end - start + 1)# 当满足下面条件时,说明新增字符已经在哈希表当中,此时更新 startwhile end - start + 1 > len(hashmap):head = s[start]hashmap[head] -= 1if hashmap[head] == 0:del hashmap[head]start += 1# 返回答案 (最大长度)return max_len

执行用时:68 ms
消耗内存:17.02 MB

参考来源:Eason

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

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

相关文章

属性动画的使用

文章目录 1 概述2 创建属性动画页面3 属性动画参数调整延时播放时间delay的设置onFinish回调函数的使用 4 关闭属性动画页面5 参考 1 概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; …

第九节HarmonyOS 常用基础组件12-TextTimer

1、描述 通过文本显示计时信息并控制其计时器状态的组件。 2、接口 TextTimer(options?: {isCountDown?: boolean, count?: number, controller?: TextTimerController}) 3、参数 参数名称 参数类型 必填 描述 isCountDown boolean 否 是否倒计时。默认值&#…

Kafka与RabbitMQ的区别

消息队列介绍 消息队列&#xff08;Message Queue&#xff09;是一种在分布式系统中进行异步通信的机制。它允许一个或多个生产者在发送消息时暂时将消息存储在队列中&#xff0c;然后由一个或多个消费者按顺序读取并处理这些消息。 消息队列具有以下特点&#xff1a; 异步通…

64.网游逆向分析与插件开发-游戏增加自动化助手接口-优化自动助手与游戏焦点的切换

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;自动化助手UI与游戏菜单的对接-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;617ac3477ef18273fb9cc2…

Linux文件系统与日志服务管理

目录 一.Linux文件系统 1.inode表和block &#xff08;1&#xff09;inode &#xff08;2&#xff09;block 2.查看inode号命令 3.Linux系统文件三种主要时间属性 4.磁盘空间还剩余很多但无法继续创建文件 5.inode大小 二.日志 1.日志保存位置 2.日志文件的分类 &a…

Selenium 学习(0.17)——软件测试之流程图绘制方法

病假5天&#xff0c;出去野20天&#xff0c;成功错过了慕课网上的期末考试。 害&#xff0c;都怪玩乐太开心了…… 反正咱又不指着全靠这个行当来吃饭&#xff0c;错过也就错过了&#xff0c;立的Flag能抢救一下还是要抢救一下吧。【这个其实早都会画了&#xff0c;而且基本也正…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…

工业无人机行业研究:预计2025年将达到108.2亿美元

近年来&#xff0c;在技术进步和各行各业对无人驾驶飞行器 (UAV) 不断增长的需求的推动下&#xff0c;工业无人机市场一直在快速增长。该市场有望在未来几年继续其增长轨迹&#xff0c;许多关键趋势和因素推动其发展。 在全球范围内&#xff0c;工业无人机市场预计到 2025 年将…

NoSQL概述与Redis入门-redis安装与测试

一、Nosql概述 1、为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大&#xff0c;单个数据库完全够用。随着用户增多&#xff0c;网站出现以下问题 数据量增加到一定程度&#xff0c;单机数据库就放不下了数据的索引&#xff08;B Tree&#xff09;,一个…

数据治理工程师 CDGA 认证-数据管理及答案

1. 组织管理数据的目标不包括&#xff08;A &#xff09; A&#xff0e;获取、存储、保护数据和确保数据资产的有效性 B&#xff0e;确保数据和信息的质量 C&#xff0e;确保利益相关方的数据隐私和保密性 D&#xff0e;防止数据和信息未经授权或被不当访问 a.确保数据资产的完…

关于外连接、内连接和子查询的使用(2)

目录 一. 前言 二. 使用外连接、内连接和子查询进行解答 三. 思维导图 一. 前言 在前面我们对外连接、内连接和子查询的使用有了一些了解&#xff0c;今天我们将继续更深入的进行学习。&#xff08;这里缺少的八个题目在博主的前面博客有解答&#xff0c;大家可以移步前面一…

zabbix-proxy代理安装

zabbix-proxy代理安装 安装zabbix-proxyserver端配置zabbix-proxy配置被监控的agent安装中问题解决监控网络设备JMX和IPMI监控方式 zabbix-proxy的安装&#xff0c;至少需要准备三台机器&#xff0c;一台安装服务端&#xff0c;一台安装agent端&#xff0c;这里就不叙述了&…

mmseg报错ValueError: size shape must match input shape. Input is 2D,size is 3

运行mmsegmentation碰到报错&#xff1a;size shape must match input shape. Input is 2D, size is 3 这个问题比较坑。有时候我们的标签size是[512&#xff0c;512&#xff0c;3]&#xff0c;然而mmsegmentation需要的标签输入应该是8位的图片&#xff0c;即[512&#xff0c;…

OBD汽车

相当于客户端与服务器 诊断设备流程 》》》》诊断服务 OBD很多的定死了 Vme就很灵活 WWH 就是两个的结合 OBD15031 SID PID 可以自己定义一些 一个字节255个 两个有效字节 02 01 0D 5555&#xff08;随机值&#xff09;这是请求 两个有效字节 01 OD&#xff08;请求速…

Python(31):Python3.7操作DB2数据库工具类

Python(31):Python3.7操作DB2数据库工具类 Python3.7操作DB2数据库 要在Python中操作DB2数据库,你可以使用IBM提供的 ibm_db 或 ibm_db_sa 包。以下是基本的步骤: 1、安装 ibm_db 包 pip install ibm_db 2、连接到DB2数据库 import ibm_db conn_str = "DATABASE=…

L1-009 N个数求和(Java)

题目 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;。随后一行按格式a1/b1 a…

51单片机之按键和数码管

51单片机之按键和数码管 ✍前言&#xff1a;♐独立按键&#x1f600;独立按键的原理&#x1f600;软件实现按键控制LED灯的亮灭 ♐数码管&#x1f60a;数码管显示数字或者字母的原理&#x1f409;共阳极数码管&#x1f409;共阴极极数码管&#x1f409;4位1体数码管 &#x1f6…

Go 语言为什么不支持并发读写 map

Go语言的map类型不支持并发读写的主要原因是并发读写会导致数据竞态&#xff08;data race&#xff09;&#xff0c;这意味着多个 goroutine 可能同时访问并修改同一个 map&#xff0c;从而引发不确定的结果。 在Go语言的设计中&#xff0c;为了防止数据竞态&#xff0c;不同于…

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

分布式系统架构设计之分布式消息队列架构解析

分布式消息队列架构是构建在分布式系统之上的消息队列架构&#xff0c;旨在提高高性能、高可用性和可伸缩性。它包括以下架构相关部分&#xff1a; 1、架构优势 分布式消息队列架构的优势主要体现在以下几个方面&#xff1a; 01 高可用性 在分布式消息队列架构中&#xff0…