无重复字符的最长子串
给定一个半角英文字符串,找出无重复字符的最长子串长度。
(笔记模板由python脚本于2024年04月11日 23:19:44创建,本篇笔记适合初通Python,熟悉六大基本数据(str字符串、int整型、float浮点型、list列表、tuple元组、set集合、dict字典)的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/137657295
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 无重复字符的最长子串
- 1、题目描述
- 2、算法解析
- 2.1 `for`循环嵌套遍历
- 2.2 我的算法优化
- 2.3 力扣题解大神算法
- 3、代码效率测试
- 3.1 代码力扣提交信息
- 3.2 本地代码运行用时测试
- 4、完整源码(Python)
◆ 无重复字符的最长子串
1、题目描述
2、算法解析
我最能想到的本题目解决方案是用“循环嵌套”,我用的for
嵌套。代码写完发现,循环次数太多,用时太久。试着优化成单层循环,剔除了大量不必要的遍历,缩短了一半的时间。后来习读大神的“双指针
”代码,力扣提交,样例用时比我“优化
”代码用时<font size=>
1
/
3
1/3
1/3还少!
2.1 for
循环嵌套遍历
代码解析
一般常规解法:双层for嵌套遍历字符串。外层控制字符串起点,内层搜索非重复字符串并记录最大长度。此法缺点
:循环次数太多。
Python代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n < 2: return n
l = 0 # 非重复字母长度初值。
ss = '' # 搜索到的非重复字符串初值。
for i in range(n):
for j in range(i, n):
if s[j] not in ss: ss += s[j]
else:
if len(ss) > l: l = len(ss)
ss = '' # 非重复字符串变量清零,方便存储下一个非重复字符串。
break
return l
2.2 我的算法优化
代码解析
仔细审验上段代码,用if
控制内存循环遍历到有字符重复时,记录无重复字符串子串
长度后结束循环,剔除不必要的循环遍历。
Python代码
class Solution2:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n < 2: return n
a = l = 0
for i in range(n):
ss = s[a:i]
local = s[i]
n = len(ss)
if local in ss:
l = n if n > l else l
while 1:
if s[i-1] == local:
a = i
break
i -= 1
n = len(s[a:])
return n if n > l else l
2.3 力扣题解大神算法
大神代码I
Python代码
class Solution3: # 力扣题解大神代码I
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
lookup.add(s[i])
return max_len
大神代码II
Python代码
class Solution4: # 力扣题解大神代码II
def lengthOfLongestSubstring(self, s: str) -> int:
dic, res, i = {}, 0, -1
for j in range(len(s)):
if s[j] in dic:
i = max(dic[s[j]], i) # 更新左指针 i
dic[s[j]] = j # 哈希表记录
res = max(res, j - i) # 更新结果
return res
3、代码效率测试
3.1 代码力扣提交信息
代码力扣提交截屏图片
一般循环遍历代码
优化算法单层循环代码
大 神 代 码 大神代码 大神代码
I I I.
I I II II.
3.2 本地代码运行用时测试
代码运行效果截屏图片
代码调用
if __name__ == '__main__':
s = 'ACaA5abababc 5dabcj5gh'
n = 100000
print(f"\n试码用例字符串:\n{s = }\n\n运行代码{n}次用时:")
s1 = Solution()
t = time()
for i in range(n):
s1.lengthOfLongestSubstring(s)
print(f"\n常规写法:\n{s1.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
s2 = Solution2()
t = time()
for i in range(10000):
s2.lengthOfLongestSubstring(s)
print(f"\n优化算法:\n{s2.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
s3 = Solution3()
t = time()
for i in range(10000):
s3.lengthOfLongestSubstring(s)
print(f"\n力扣题库大佬题解代码:\n{s3.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
4、完整源码(Python)
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
from time import time
class Solution4: # 力扣大神代码II
def lengthOfLongestSubstring(self, s: str) -> int:
dic, res, i = {}, 0, -1
for j in range(len(s)):
if s[j] in dic:
i = max(dic[s[j]], i) # 更新左指针 i
dic[s[j]] = j # 哈希表记录
res = max(res, j - i) # 更新结果
return res
# 一般常规解法:双层for嵌套遍历字符串。外层控制字符串起点,内层搜索非重复字符串并记录最大长度。此法缺点:循环次数太多。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n < 2: return n
l = 0 # 非重复字母长度初值。
ss = '' # 搜索到的非重复字符串初值。
for i in range(n):
for j in range(i, n):
if s[j] not in ss: ss += s[j]
else:
if len(ss) > l: l = len(ss)
ss = '' # 非重复字符串变量清零,方便存储下一个非重复字符串。
break
return l
class Solution2:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n < 2: return n
a = l = 0
for i in range(n):
ss = s[a:i]
local = s[i]
n = len(ss)
if local in ss:
l = n if n > l else l
while 1:
if s[i-1] == local:
a = i
break
i -= 1
n = len(s[a:])
return n if n > l else l
class Solution3: # 力扣大神代码I
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
lookup.add(s[i])
return max_len
if __name__ == '__main__':
s = 'ACaA5abababc 5dabcj5gh'
n = 100000
print(f"\n试码用例字符串:\n{s = }\n\n运行代码{n}次用时:")
s1 = Solution()
t = time()
for i in range(n):
s1.lengthOfLongestSubstring(s)
print(f"\n常规写法:\n{s1.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
s2 = Solution2()
t = time()
for i in range(10000):
s2.lengthOfLongestSubstring(s)
print(f"\n优化算法:\n{s2.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
s3 = Solution3()
t = time()
for i in range(10000):
s3.lengthOfLongestSubstring(s)
print(f"\n力扣题库大神题解代码I:\n{s3.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
s4 = Solution4()
t = time()
for i in range(10000):
s4.lengthOfLongestSubstring(s)
print(f"\n力扣题库大神题解代码II:\n{s4.lengthOfLongestSubstring(s) = }")
print(f"{time()-t:.2f}s")
上一篇: 插值字符串格式代码中的“!”(Python)(读到插值字符串格式化代码中有“!”,进行了一番探究,了解了其中的一点“隐秘”,在此共享)
下一篇:
我的HOT博:
本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有
7
7
7篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
原文地址:https://blog.csdn.net/m0_57158496/article/details/137657295
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!