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 GAE、Django导出Excel的方法
Nov 24 Python
Python中标准模块importlib详解
Apr 16 Python
python的文件操作方法汇总
Nov 10 Python
python使用udp实现聊天器功能
Dec 10 Python
python列表推导式入门学习解析
Dec 02 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python的信号库Blinker用法详解
Dec 31 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 Python
如何利用python实现列表嵌套字典取值
Jun 10 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 ios推送(代码)
2013/07/01 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python得到windows自启动列表的方法
2018/10/14 Python
简单了解python元组tuple相关原理
2019/12/02 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
集体备课反思
2014/02/12 职场文书
单位租房协议范本
2014/12/03 职场文书
Python简易开发之制作计算器
2022/04/28 Python