​无重复字符的最长字串是一道经典的额字符串处理算法的题目,日常编程过程中,处理字符串是很多见的。用Python来实现leetcode这道算法题,这题会涉及到一个概念“滑动窗口”的概念。

一、题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度(Longest substring without repeating characters)。

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

示例 2:

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

示例 3:

输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

二、解题思路

先来定义一下“子串”,根据题目描述,“子串”就是字符串中截取某一部分,长度从1到该字符串的长度。比如“abc”的子串集合是:

[‘a’, ‘b’, ‘c’, ‘ab’, ‘bc’, ‘abc’]

用 Python 生成这个集合很容易,你是否想到了?

def subs(s: str): results = [] for begin in range(len(s)): for length in range(len(s)-begin): results.append(s[begin:begin + length + 1]) return resultsz = subs('abcde')print(z)

那么问题来了,任意长度为n的字符串一共有多少个这样的“子串”呢?答案是:(n+1) * n / 2 。从上面的例子很容易得出这个答案:begin等于0时,长度可以有 n – 0 个,begin等于1时,长度可以有 n – 1个,以此类推,总数就是:

n + (n-1) + … + 1 => (n+1)*n / 2

(1)暴力解法

明白了“子串”的概念和获取方法,自然而然的就得到了最朴素也是最“暴力”的解法:遍历字符串得到所有“子串”,然后判断每个“子串”是否有重复字符,最终就会得到无重复最长子串了。

这个“暴力”算法中,计算所有子串的时间复杂度是 O(n2),而判断一个子字符串是否有重复字符,又要从头到尾遍历一遍该字符串,所有最终的时间复杂度可以达到 O(n3)。

这个解法是不能被接受的,提到它全是因为前面对“子串”的解释及其数量计算,来练习Python对字符串的操作。

(2)滑动窗口

“滑动窗口”这个概念在计算机算法中非常常见。该算法可以把嵌套的循环转化为单循环从而降低时间复杂度。它在很多不同的领域都有应用:

TCP协议的滑动窗口进行流量控制

NLP(自然语言处理)中的 N-gram

图像处理中的物体识别

有兴趣的同学可以深入了解上面提到的应用领域。

下面我们看看,“滑动窗口”如何进行字符串处理。结合题目中的例子“abcabcbb”这个字符串,我们来看看如何找它的无重复最长子串。

首先,我们定义窗口的两端:begin和end,分别表示要找的子串的开头和结尾。

开始的时候,begin和end都指向0的位置即‘a’,然后end不断后移(窗口变宽),当遇到第二个‘a’时(遇见重复字符)就得到一个子串,其长度就是end和begin位置的差。

如何判断是否遇到了重复字符‘a’呢?需要一个字典作为辅助数据结构,把end从头开始遇到的每个字符及其索引位置都放到字典里面,end每次移动到新字符就查一下字典即可。

通过字典,我们遇到第二个‘a’时就可以找到存在字典里面的第一个‘a’的位置。为了继续寻找无重复子串,begin就要指向第一个‘a’后面一个的位置即‘b’。然后end继续后移到‘b’,有发现它与前面的‘b’重复,计算子串长度赋值给最大长度(需要比较),同时begin要移动第一个‘b’后面的位置即‘c’。

这样依次移动end到字符串末尾就可以找到最长的子串,“子串窗口”也就从头移到了末尾。而只需要end从头到尾的一次循环即可。

把这个过程用Python实现如下:

class Solution: def lengthofLongestSubstring(self, s: str) -> int: maxlen = 0 memo = dict() begin, end = 0, 0 n = len(s) while end < n: last = memo.get(s[end]) memo[s[end]] = end if last is not None: maxlen = max(maxlen, end-begin) begin = max(begin, last + 1) end += 1 maxlen = max(maxlen, end-begin) return maxlen

提交后就可以看到结果。“执行时间”还只是个参考,再一次提交相同代码结果不是图中的击败91%,而变成了百分之十几。

python leetcode_python实现leetcode中无重复字符的最长字串相关推荐

  1. LeetCode 3.无重复字符的最长字串(滑动窗口)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  2. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

    [问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...

  3. php无重复字符的最长子串,无重复字符的最长字串问题

    leetcode3:无重复字符的最长字串问题 问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释 ...

  4. LeetCode中等题之无重复字符的最长字串

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  5. leetcode刷题:1.无重复字符的最长字串

    题目: 方法一: 首先我们可以想到暴力解法,就是 ·逐个生成字符串 ·看他受否含有重复字符 如下代码暴力法: int LenOfUniqueStr(char* Start) {int Validity ...

  6. 算法--无重复字符的最长字串(详细)

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 class Solution {public int lengthOfLongestSubstring(String s) {// ...

  7. 滑动窗口1——无重复字符的最长字串

    滑动窗口本质是一个队列,输入进入这个窗口(队列),当不满足条件时,移动这个队列: 如何移动,只需要将左边的元素移除即可,直到满足条件. import java.util.HashSet; import ...

  8. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

  9. leetcode 3.无重复字符的最长子串(中等)

    难度:中等 频率:271 题目:给定一个字符串s,请你找出其中不含有重复字符的最长字串的长度 题目类型:HashSet 结构 or 滑动窗口 解题方法:HashSet+滑动窗口(双指针标记left+r ...

最新文章

  1. Android书籍推荐
  2. [导入]ASP.NET 2.0 读取配置文件[INI](示例代码下载)
  3. 查找nginx安装的路径以及相关安装操作命令
  4. MyEclipse9.0正式版汉化
  5. Java ClassLoader setClassAssertionStatus()方法与示例
  6. 吴军《智能时代》序言汉译英练习
  7. 蛋制品加工行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. Rocky4.2下安装达梦(DM)6数据库
  9. zabbix 接触这段时间的感悟
  10. IBM行贿案凸显外企在华的非正常之道
  11. 浅谈AQS锁实现机制(含ReentrantReadWriteLock读写锁加锁解锁相关源码分析)
  12. sqlmap 使用教程
  13. 华为网络篇 传输文件-08
  14. 【数据分析方法论】关于思维、营销、咨询、绩效管理的一些经典分析框架
  15. 语音源码构建了语音社交的应用基础,模式多样,功能丰富
  16. 大道至简之八:透过现象看本质(房价推手)
  17. 神经网络的基本原理,神经网络算法三大类
  18. 神经网络epoch和batch的粗浅理解
  19. win10计算机怎么连接网络,如何创建宽带连接_win10电脑宽带连接怎么创建 - 驱动管家...
  20. html guids标签,Windows下编译kaldi--kaldi(二)

热门文章

  1. IDEA创建springboot项目:Unable to import maven project: See logs for details
  2. python 消息队列如何接收处理_python使用消息队列RabbitMq(进阶)
  3. 上海大华条码称代码_银豹收银之大华条码秤传称设置
  4. Python 之列表的常用方法
  5. python cv2 matchtemplate_OpenCV-Python系列十:模板匹配
  6. 105.敏捷开发模型
  7. mysql迁移cassandra_使用datax迁移cassandra数据
  8. Cpp 对象模型探索 / 不能被继承的类
  9. 计算机设备间使用面积,【IBE】综合布线设计中的常用计算公式
  10. linux mysql io压力大_MySQL性能调优(四) Linux 磁盘IO