Python算法题集_无重复字符的最长子串
本文为Python算法题集之一的代码示例
题目3:无重复字符的最长子串
说明:给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
- 感慨:本题很特殊,特别特殊,超级无敌特殊!!!
程序员没有一个没写过字符串处理,没有一个没写过查找字符串子串
问题是谁都能写,可是写出来就是原形毕露,稍不留神,就要贻笑大方
大虾们是高手,十年练剑,深藏不露,都是传说中十步杀一人,千里不留行的人物
如果本文写得笨拙浅薄,还请大虾们多多包涵,高抬贵手~~
本题求解有两个重点工作
一是在子串中进行字符查重
可以使用基本查重【集合中查询子元素】、字典查重【哈希值,值为数字】、下标查重【ord(char)
为下标,数组元素为数字】
二是对字符串进行遍历找出所有子串
可使用双重循环、单循环单指针、双指针【滑动窗口】
注意:代码运行每次速度都不同,估计服务器负载有波动
注意:代码运行每次速度都不同,估计服务器负载有波动
注意:代码运行每次速度都不同,估计服务器负载有波动
-
新手基本型【基本查重+双重循环】,无脑遍历,注定超时
用双重循环遍历所有子串,字符查重则可以采用集合
set
去重查重或者字符串查子串函数查重。此算法颇为无脑,算是初学程序者的作品,肯定会超时,就不给它表现的机会了def longest_unique_substr_newbie(s): # 双循环遍历、集合查重iLen=len(s)iMaxsublen=0for iIdx in range(iLen):for iJdx in range(iIdx+1, iLen-1):if len(set(s[iIdx:iJdx])) == iJdx-iIdx:iMaxsublen = max(iMaxsublen, iJdx-iIdx)return iMaxsublenprint(longest_unique_substr_newbie('abcabcbb')) # 运行结果 3
-
下标查重+双重循环,有所改善,超过77%
def longest_unique_substr_ext1(s): # 下标查重+双重循环iLen = len(s)iMaxsublen = 0icharcount = [0] * 128ileft, iright = 0, 0while iright < iLen:icharcount[ord(s[iright])] += 1while icharcount[ord(s[iright])] > 1:icharcount[ord(s[ileft])] -= 1ileft += 1iMaxsublen = max(iMaxsublen, iright - ileft + 1)iright += 1return iMaxsublenprint(longest_unique_substr_ext1('abcabcbb')) # 运行结果 3
-
字典查重【单判断】+双指针,有所改善,超过77%
def longest_unique_substr_ext2(s): # 字典查重+双指针iLen = len(s)iMaxsublen = 0dictwindow = {}ileft, iright = 0, 0while iright < iLen:if s[iright] in dictwindow:ileft = max(ileft, dictwindow[s[iright]] + 1)dictwindow[s[iright]] = irightiMaxsublen = max(iMaxsublen, iright - ileft + 1)iright += 1return iMaxsublenprint(longest_unique_substr_ext2('abcabcbb')) # 运行结果 3
-
集合查重+双指针,表现良好,超过87%
def longest_unique_substr_ext3(s): # 集合查重+双指针iLen=len(s)iMaxsublen, ileft, iright = 0, 0, 0set_substr = set()while iright<iLen:if s[iright] in set_substr:set_substr.remove(s[ileft])ileft += 1else:set_substr.add(s[iright])iMaxsublen = max(iMaxsublen, iright-ileft+1)iright+=1return iMaxsublenprint(longest_unique_substr_ext3('abcabcbb')) # 运行结果 3
-
集合查重+单循环单指针,有所改善,超过77%
def longest_unique_substr_ext4(s): # 集合查重+单循环单指针iLen = len(s)iMaxsublen = 0set_substr = set()istart = 0for iIdx in range(iLen):while s[iIdx] in set_substr:set_substr.remove(s[istart])istart += 1set_substr.add(s[iIdx])iMaxsublen = max(iMaxsublen, iIdx - istart + 1)return iMaxsublenprint(longest_unique_substr_ext4('abcabcbb')) # 运行结果 3
-
下标查重+双指针,有所改善,超过76%
def longest_unique_substr_ext5(s): # ASC码下标定位,双指针iLen = len(s)iMaxsublen = 0char_index = [-1] * 128ileft, iright = 0, 0while iright < iLen:if char_index[ord(s[iright])] >= ileft:ileft = char_index[ord(s[iright])] + 1char_index[ord(s[iright])] = irightiMaxsublen = max(iMaxsublen, iright - ileft + 1)iright += 1return iMaxsublenprint(longest_unique_substr_ext5('abcabcbb')) # 运行结果 3
-
字典查重【双判断】+双指针,表现良好,超过87%
def longest_unique_substr_ext6(s): # 字典查重+双指针iLen = len(s)iMaxsublen = 0dictwindow = {}ileft, iright = 0, 0while iright < iLen:if s[iright] in dictwindow and dictwindow[s[iright]] >= ileft:ileft = dictwindow[s[iright]] + 1dictwindow[s[iright]] = irightiMaxsublen = max(iMaxsublen, iright - ileft + 1)iright += 1return iMaxsublenprint(longest_unique_substr_ext6('abcabcbb')) # 运行结果 3
-
下标查重+单循环单指针,表现良好,超过88
def longest_unique_substr_ext7(s): # 下标查重+单循环单指针iLen = len(s)iMaxsublen, istart = 0, 0dictwindow = {}for iIdx in range(iLen):if s[iIdx] in dictwindow and dictwindow[s[iIdx]] >= istart:istart = dictwindow[s[iIdx]] + 1dictwindow[s[iIdx]] = iIdxiMaxsublen = max(iMaxsublen, iIdx - istart + 1)return iMaxsublenprint(longest_unique_substr_ext7('abcabcbb')) # 运行结果 3
-
下标查重+单循环单指针跳跃,华山论剑,谁是英雄!
def longest_unique_substr_ext8(s): # 下标查重+单循环单指针iLen = len(s)iMaxsublen, istart = 0, 0listchar = [-1] * 128for iIdx in range(iLen):if listchar[ord(s[iIdx])] >= istart:istart = listchar[ord(s[iIdx])] + 1listchar[ord(s[iIdx])] = iIdxiMaxsublen = max(iMaxsublen, iIdx - istart + 1)return iMaxsublenprint(longest_unique_substr_ext8('abcabcbb')) # 运行结果 3
一日练,一日功,一日不练十日空
may the odds be ever in your favor ~
相关文章:

Python算法题集_无重复字符的最长子串
本文为Python算法题集之一的代码示例 题目3:无重复字符的最长子串 说明:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a…...

12.Elasticsearch应用(十二)
Elasticsearch应用(十二) 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题: 将索引库从逻辑上拆分为N个分片(Shard),存储到多个节点单点故障问题&a…...

linux -- 内存管理 -- SLAB分配器
SLAB分配器(slab allocator) SLAB分配器用于小内存空间管理,基本思想是:先利用页面分配器分配出单个或多个连续的物理页面,然后再此基础上将整块页面分割为多个相等的小内存单元,来满足小内存空间分配的需…...

【MySQL】学习如何通过DQL进行数据库数据的条件查询
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-63IIm2s5sIhQfsfy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
TS:子类型关系
子类型关系 1、概念1.1 里氏替换原则1.2 自反性1.3 传递性 2、顶端类型 和 尾端类型3、字面量类型4、undefined 和 null5、枚举类型6、函数类型6.1 变型6.1.1 协变6.1.2 逆变6.1.3 双变 6.2 函数类型间的子类型关系6.2.1 函数参数数量6.2.2 函数参数类型A、非严格函数类型检查B…...

IDEA插件(MyBatis Log Free)
引言 在Java开发中,MyBatis 是一款广泛使用的持久层框架,它简化了SQL映射并提供了强大的数据访问能力。为了更好地调试和优化MyBatis应用中的SQL语句执行,一款名为 MyBatis Log Free 的 IntelliJ IDEA 插件应运而生。这款插件旨在帮助开发者…...

Redis(八)哨兵机制(sentinel)
文章目录 哨兵机制案例认识异常 哨兵运行流程及选举原理主观下线(Subjectively Down)ODown客观下线(Objectively Down)选举出领导者哨兵选出新master过程 哨兵使用建议 哨兵机制 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新…...

[数据结构]-哈希
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…...

宝塔控制面板配置SSL证书实现网站HTTPS
宝塔安装SSL证书提前申请好SSL证书,如果还没有,先去Gworg里面申请,一般几分钟就可以下来,申请地址:首页-Gworg官方店-淘宝网 一、登录邮箱下载:Gworg证书文件目录 ,都会有以下五个文件夹。宝塔…...
elasticsearch优化总结
参考: https://docs.docker.com/manuals/ Manuals | Docker Docs Run Elasticsearch locally | Elasticsearch Guide [8.12] | Elastic 让你的ES查询性能起飞:Elasticsearch 查询优化攻略“一网打尽” - 知乎...
图论第三天|127. 单词接龙 841.钥匙和房间 463. 岛屿的周长 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II
目录 Leetcode127. 单词接龙Leetcode841.钥匙和房间Leetcode463. 岛屿的周长Leetcode1971. 寻找图中是否存在路径Leetcode684.冗余连接Leetcode685.冗余连接II Leetcode127. 单词接龙 文章链接:代码随想录 题目链接:127. 单词接龙 思路:广搜搜…...
react的高阶函数HOC:
React 的高阶组件(Higher-Order Component,HOC)是一种用于复用组件逻辑的模式。它是一个函数,接收一个组件作为参数,并返回一个新的增强过的组件。 HOC 可以用于实现以下功能: 代码复用:通过将…...

STM32——中断系统和外部中断EXTI
一、中断 1.1中断系统 中断系统是管理和执行中断的逻辑结构; 1.2中断 系统在执行主程序过程中,出现了特定的触发条件(触发源),系统停止执行当前程序,转而去执行中断程序,执行完毕后…...
使用uniApp+vue3+Vite4+pinia+sass技术栈构建微信小程序
使用uniApp的cli模式安装,可以使用vscode开发。不用再单独去下载HBuilderX. 1.基础安装 vue3tsuniapp 方法一: npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project方法二:可以去uni-preset-vue的vite分支下选择vite-ts直接下载zi…...

npm 被滥用 -- 有人上传了 700 多个武林外传切片视频
Sonatype 安全研究团队最近曝光了一起滥用 npm 的案例 —— 他们发现在 npm 上托管的 748 个软件包实际上是视频文件。 据介绍,这些软件包每个大小约为 54.5MB,包名以 “wlwz” 为前缀,并附带了代表日期的数字。根据时间戳显示,这…...

代码随想录算法训练营29期|day34 任务以及具体任务
第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.ab…...
LeetCode 每日一题 2024/1/22-2024/1/28
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/22 670. 最大交换1/23 2765. 最长交替子数组1/24 2865. 美丽塔 I1/25 2859. 计算 K 置位下标对应元素的和1/26 2846. 边权重均等查询1/27 2861. 最大合金数1/28 365. 水壶…...
好用的学习与开发工具
1. 首推 UTools 官网地址 uTools官网 - 新一代效率工具平台 介绍 uTools 是一个极简、插件化的现代桌面软件,通过自由选配丰富的插件,打造得心应手的工具集合。 通过快捷键(默认 alt space )就可以快速呼出这个搜索框。你可…...

(自用)learnOpenGL学习总结-高级OpenGL-立方体贴图
ok终于来到了立方体贴图了,在这里面我们可以加入好看的天空包围盒,这样的画我们的背景就不再是黑色的了! 首先,立方体贴图和前面的sampler2D贴图一样,不过是6个2D组成的立方体而已。 那么为什么要把6个组合在一起呢&…...

【计算机网络】——TCP协议
📑前言 本文主要是【计算机网络】——传输层TCP协议的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...