[LeetCode] 3. Longest Substring Without Repeating Characters 题解

问题描述

输入一个字符串,找到其中最长的不重复子串

例1:

输入:"abcabcbb"
输出:3
解释:最长非重复子串为"abc"
复制代码

例2:

输入:"bbbbb"
输出:1
解释:最长非重复子串为"b"
复制代码

例3:

输入:"pwwkew"
输出:3
解释:最长非重复子串为"wke"
复制代码

问题难度

Medium

解题思路

本题采用「滑动窗口法」可以达到较理想的时间复杂度 O(n),滑动窗口指的是当前非重复子串所在的窗口,此滑动窗口有两种操作方法

  1. 检查下一个字符是否会重复,如未重复,则将窗口向右扩大
  2. 发现重复字符,则将窗口右边界保持不变,左边界右移,以此缩小窗口

上面的操作比较容易理解,唯一需要注意的是第 2 点中,当发现重复字符时,窗口左边界向右移动几个单位,我们可以看一个示意图:

+---------+ 
| a b c d | e d x y z 
+---------++-----------+ 
| a b c d e | d x y z // 未发现重复,向右扩大窗口
+-----------++-----+ 
a b c d | e d | x y z // 发现重复,缩小窗口+-----+
复制代码

假设输入字符串为 "abcdedxyz",一直到我们遍历到字符 e 时,均未发现重复的字符串,至此对窗口进行的操作都是向右扩大,当检查到下一个字符 d 时,由于前面字符串中已经出现过该字符,所以窗口左边界需要进行右移,移动的位置、即新子串窗口的起始点,正好是两个重复字符中、第一个重复字符的右边,如图所示为字符 e 所在的位置。

至此,我们可以开始写程序了:

def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""maxlen = 0current_substring = [None]*128current_substring_len = 0begin_index = 0for i in s:stoi = ord(i)if current_substring[stoi] is None or current_substring[stoi] < begin_index:current_substring[stoi] = begin_index + current_substring_lencurrent_substring_len += 1else:if maxlen < current_substring_len:maxlen = current_substring_len sub_len = current_substring[stoi] - begin_index + 1begin_index = current_substring[stoi] + 1current_substring_len -= sub_lencurrent_substring[stoi] = current_substring_len + begin_indexcurrent_substring_len += 1if maxlen < current_substring_len:maxlen = current_substring_lenreturn maxlen
复制代码

以上代码中,current_substring 是一个缓冲区,用来存放当前子字符串,缓冲区声明为 128 个是为了让数组的下标空间能容纳 128 个 ASCII 字符,即这里用数组的下标来表示字符,这样做的好处是可以很快的知道某个字符是否出现重复,数组的内容我们填的是该字符对应的下标,例如字符串 "abcde" 填到 current_substring 中为:

            index:   0..97  98  99  100 101 ..+---+---+---+---+---+---+---+
current_substring: |...| 0 | 1 | 2 | 3 | 4 |...|+---+---+---+---+---+---+---+
复制代码

我们用变量 begin_index 来记录当前窗口在字符串中的起始位置,而 current_substring_len 用来记录当前窗口的长度。for 循环是对字符串的遍历。

首先将字符转化为其对应的整数 stoi,检查 stoi 中的内容是否为空,或其存储的位置是否在窗口的左边,如是则表示该字符在 begin_index 之后未出现过,非重复子串可以继续累加。

否则表示出现重复,出现重复时,需要将窗口的左边界右移,或者说对新的滑动窗口进行初始化,实际上只需更新 begin_indexcurrent_substring_len 两个值。

最后,我们需要在每一次窗口改变时,或在结束遍历时,判断当前子字符串的长度是否是最长的,并将最长串存储在 maxlen 中,作为结果返回。

原题链接

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

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

相关文章

WPF中MVVM模式的 Event 处理

WPF的有些UI元素有Command属性可以直接实现绑定&#xff0c;如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢&#xff1f; 答案就是使用EventTrigger可以实现。 继续上一篇对Slider的研究&#xff0c;在View中修改Interaction. <i:Interaction.Triggers>&…

Eclipse 插件开发 向导

阅读目录 最近由于特殊需要&#xff0c;开始学习插件开发。   下面就直接弄一个简单的插件吧!   1 新建一个插件工程   2 创建自己的插件名字&#xff0c;这个名字最好特殊一点&#xff0c;一遍融合到eclipse的时候&#xff0c;不会发生冲突。   3 下一步&#xff0c;进…

线性回归 假设_线性回归的假设

线性回归 假设Linear Regression is the bicycle of regression models. It’s simple yet incredibly useful. It can be used in a variety of domains. It has a nice closed formed solution, which makes model training a super-fast non-iterative process.线性回归是回…

ES6模块与commonJS模块的差异

参考&#xff1a; 前端模块化 ES6 在语言标准的层面上&#xff0c;实现了模块功能&#xff0c;而且实现得相当简单&#xff0c;旨在成为浏览器和服务器通用的模块解决方案。 其模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#x…

solo

solo - 必应词典 美[soʊloʊ]英[səʊləʊ]n.【乐】独奏(曲)&#xff1b;独唱(曲)&#xff1b;单人舞&#xff1b;单独表演adj.独唱[奏]的&#xff1b;单独的&#xff1b;单人的v.独奏&#xff1b;放单飞adv.独网络梭罗&#xff1b;独奏曲&#xff1b;索罗变形复数&#xff1…

Eclipse 简介和插件开发天气预报

Eclipse 简介和插件开发 Eclipse 是一个很让人着迷的开发环境&#xff0c;它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件&#xff0c;但是 Eclipse 已经超越了开发环境的概念&#xff0c;可以…

趣味数据故事_坏数据的好故事

趣味数据故事Meet Julia. She’s a data engineer. Julia is responsible for ensuring that your data warehouses and lakes don’t turn into data swamps, and that, generally speaking, your data pipelines are in good working order.中号 EETJulia。 她是一名数据工程…

Linux 4.1内核热补丁成功实践

最开始公司运维同学反馈&#xff0c;个别宿主机上存在进程CPU峰值使用率异常的现象。而数万台机器中只出现了几例&#xff0c;也就是说万分之几的概率。监控产生的些小误差&#xff0c;不会造成宕机等严重后果&#xff0c;很容易就此被忽略了。但我们考虑到这个异常转瞬即逝、并…

python分句_Python循环中的分句,继续和其他子句

python分句Python中的循环 (Loops in Python) for loop for循环 while loop while循环 Let’s learn how to use control statements like break, continue, and else clauses in the for loop and the while loop.让我们学习如何在for循环和while循环中使用诸如break &#xf…

eclipse plugin 菜单

简介&#xff1a; 菜单是各种软件及开发平台会提供的必备功能&#xff0c;Eclipse 也不例外&#xff0c;提供了丰富的菜单&#xff0c;包括主菜单&#xff08;Main Menu&#xff09;&#xff0c;视图 / 编辑器菜单&#xff08;ViewPart/Editor Menu&#xff09;和上下文菜单&am…

[翻译 EF Core in Action 2.0] 查询数据库

Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天…

hdu5692 Snacks dfs序+线段树

题目传送门 题目大意&#xff1a;给出一颗树&#xff0c;根节点是0&#xff0c;有两种操作&#xff0c;一是修改某个节点的value&#xff0c;二是查询&#xff0c;从根节点出发&#xff0c;经过 x 节点的路径的最大值。 思路&#xff1a;用树状数组写发现还是有些麻烦&#xff…

python数据建模数据集_Python中的数据集

python数据建模数据集There are useful Python packages that allow loading publicly available datasets with just a few lines of code. In this post, we will look at 5 packages that give instant access to a range of datasets. For each package, we will look at h…

打开editor的接口讨论

【打开editor的接口讨论】 先来看一下workbench吧&#xff0c;workbench从静态划分应该大致如下&#xff1a; 从结构图我们大致就可以猜测出来&#xff0c;workbench page作为一个IWorkbenchPart&#xff08;无论是eidtor part还是view part&#…

【三角函数】已知直角三角形的斜边长度和一个锐角角度,求另外两条直角边的长度...

如图,已知直角三角形ABC中,∠C90, ∠Aa ,ABc ,求直角边AC、BC的长度. ∵ ∠C90,∠Aa ,ABc ,Cos∠AAC/AB ,Sin∠ABC/AB ,∴ ACAB*Cos∠Ac*Cosa ,BCAB*Sin∠Ac*Sina . 复制代码

网络攻防技术实验五

2018-10-23 实验五 学 号201521450005 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验五 综合渗透 学生姓名 陈军 年级 2015 区队 五 指导教师 高见 信息技术与网络安全学院 2018年10月23日 实验任务总纲 2018—2019 …

usgs地震记录如何下载_用大叶草绘制USGS地震数据

usgs地震记录如何下载One of the many services provided by the US Geological Survey (USGS) is the monitoring and tracking of seismological events worldwide. I recently stumbled upon their earthquake datasets provided at the website below.美国地质调查局(USGS)…

Springboot 项目中 xml文件读取yml 配置文件

2019独角兽企业重金招聘Python工程师标准>>> 在xml文件中读取yml文件即可&#xff0c;代码如下&#xff1a; 现在spring-boot提倡零配置&#xff0c;但是的如果要集成老的spring的项目&#xff0c;涉及到的bean的配置。 <bean id"yamlProperties" clas…

eclipse 插件打包发布

如果想把调试好的插件打包发布&#xff0c;并且在ECLIPSE中可以使用. 1.File-->Export 2.选择 PLug-in Development下 的 Deployable plug-ins and fragments 3.进入 Deployable plug-ins and fragments 页面 4.把底下的 Destubatuib 的选项中选择 Archive file 在这里添入要…

无法获取 vmci 驱动程序版本: 句柄无效

https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html 将 vmci0.present "TURE" 改为 “FALSE”; 转载于:https://www.cnblogs.com/limanjihe/p/9868462.html