Python3 无重复字符的最长子串的实现


Posted in Python onOctober 08, 2019

题目:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例:

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

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

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

思路:

这道题会很自然的想到暴力解法,就是按位递增依次检查子串是否重复,并记下目前最大的子串长度,如果重复就从下一位索引处的字符开始重新检查。下面是代码实现:

class Solution:
 def lengthOfLongestSubstring(self, s: str) -> int:
 # 最长子串的长度
 max_len = 0
 # 存放字符的字典
 char_dict = {}
 index = 0
 while s[index:].__len__() >= max_len:
  # 当前最长子串长度
  current_len = 0
  for item in s[index:]:
  old_index = char_dict.get(item)
  if old_index is not None:
   index = old_index + 1
   char_dict.clear()
   break
  char_dict[item] = index
  index += 1
  current_len += 1
  if current_len > max_len:
  max_len = current_len
 return max_len

开始只是想跑通,没想到超出了时间限制。看起来代码显得是有点??拢??撬悸酚Ω檬敲挥形侍獾模?颐腔故谴颖槔?慕嵌壤从呕??/p>

优化:

在上面的代码中,当遇到重复字符时,遍历的起始点就往后挪一位,但其实两个重复字符之间的部分是不会重复的,比如字符串fbacdadfeed,在第一次从 f 开始遍历遇到重复字符即第二个 a 的时候,下一次遍历不应该从 b 开始,而是应该从前一个重复字符的后一个字符即 c 开始。

确定思想,并多次优化后的代码如下:

class Solution:
  def lengthOfLongestSubstring(self, s: str) -> int:
    char_dict = {}
    start, end, max_len = -1, 0, 0
    str_len = s.__len__()
    while end < str_len:
      char = s[end]
      if char in char_dict:
        old_index = char_dict[char]
        if old_index > start:
         start = old_index 
      diff = end -start
      if diff > max_len:
        max_len = diff 
      char_dict[char] = end
      end += 1
    return max_len;

这里使用了内置的.__len__()方法来获取字符串长度而不是len(),并且使用了多个看似多此一举的临时变量来存储值,比如char和diff,都是为了节省时间,蚊子小也是肉嘛。

结果也是 ok 的:

Python3 无重复字符的最长子串的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中操作字符串之rstrip()方法的使用
May 19 Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 Python
python让列表倒序输出的实例
Jun 25 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
python pygame模块编写飞机大战
Nov 20 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
python中的函数递归和迭代原理解析
Nov 14 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python如何实现FTP功能
May 28 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 #Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 #Python
python实现的按要求生成手机号功能示例
Oct 08 #Python
python集合的创建、添加及删除操作示例
Oct 08 #Python
pip install python 快速安装模块的教程图解
Oct 08 #Python
python内置函数sorted()用法深入分析
Oct 08 #Python
Python使用tkinter模块实现推箱子游戏
Oct 08 #Python
You might like
PHP MSSQL 存储过程的方法
2008/12/24 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
js 一个关于图片onload加载的事
2013/11/10 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
python中实现精确的浮点数运算详解
2017/11/02 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python 读取修改pcap包的例子
2019/07/23 Python
python list多级排序知识点总结
2019/10/23 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
2013年入党人员的自我鉴定
2013/10/25 职场文书
档案检查欢迎词
2014/01/13 职场文书
副厂长岗位职责
2014/02/02 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
旷工检讨书大全
2015/08/15 职场文书
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技