【python-leetcode03-滑动窗口法】无重复字符的最大子串
时间:2022-07-23
本文章向大家介绍【python-leetcode03-滑动窗口法】无重复字符的最大子串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
按照惯例,首先是我们的简单版滑动窗口法:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
tmp = 0 #用于记录满足条件得最大值
for i in range(1,len(s)+1):#步长从1到len(s)+1
for j in range(len(s)-i+1):#窗口左端
if len(set(s[j:j+i])) == len(s[j:j+i]):#如果取集合后的长度和原始窗口长度一样,说明这个窗口是不含重复字符的
tmp = max(tmp,i)#更新tmp的值
return tmp #最后返回即可
看下结果,依旧超时,不过呢:
只有一个用例没通过,如果想要把题目做出来,简单版的滑动窗口,简单粗暴。
要想通过就得使用升级版的滑动窗口了:一个左边界start,一个记录最大值max_num,一个记录当前遍历得子串hash。从左开始遍历数组,先将其加入到hash中,接下来如何判断是否出现了重复得字符呢?想了有点久,想到一种巧妙得办法,如果hash表中得键得长度小于hash表中值得和,说明出现了重复的字符,此时左边界就起作用了,让左边界对应的字符在hash中的值减一,如果还有重复的,start+=1,在执行减一操作,如果该字符值变为0,就将其删除,直到hash表中的键的长度等于值得和,此时记录下当前符合的最大值。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) == 0:
return 0
if len(s) == 1:
return 1
start = 0 # 滑动窗口左端
max_num = 0 # 用于计算最大值
from collections import defaultdict
hash = defaultdict(int)
for i in range(len(s)):
hash[s[i]]+=1
while len(hash)<self.dictSum(hash):
hash[s[start]] -= 1
if hash[s[start]] == 0:
del hash[s[start]]
start += 1
max_num = max(max_num,i-start+1)
return max_num
def dictSum(self,dic):
sum = 0
for i in dic:
sum += dic[i]
return sum
结果:
虽然有点惨,但好歹先把它做出来了。
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- 用js代码理解区块链,最简版本
- 谈谈IE针对Ajax请求结果的缓存
- Ajax请求过程中显示“进度”的简单实现
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- 【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
- 区块链钱包mMoney向GooglePay、Applepay发起挑战
- Model验证系统运行机制是如何实现的?
- CentOS 6.8 部署zookeeper集群
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 死磕Java之分析short类型
- 死磕Java之Java数据类型的来龙去脉
- 请不要再使用判断进行参数校验了
- 检测假新闻:比较不同的分类方法的准确率
- SpringBoot下载xlsx模板,导出excel数据
- 如何利用机器学习和Gatsby.js创建假新闻网站
- Spring Security 实战干货: 401和403状态
- Spring Data R2DBC响应式操作MySQL
- 项目端口可以设置为 6666 吗?
- 【JS】666- window.reqeustIdleCallback方法详解
- 一个无聊的宏定义
- windows的Ubuntu子系统ssh和ftp
- 面试官问:如何设计一个安全的对外接口?
- [树莓派公网远程监控]autossh反向代理
- 用 LDSC 计算遗传度以及遗传相关性