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打造出适合自己的定制化Eclipse IDE
Mar 02 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
python事件驱动event实现详解
Nov 21 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
python3中numpy函数tile的用法详解
Dec 04 Python
Python sys模块常用方法解析
Feb 20 Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
为什么相对PHP黑python的更少
Jun 21 Python
利用Python将多张图片合成视频的实现
Nov 23 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
提升PHP执行速度全攻略(上)
2006/10/09 PHP
php的4种常用运行方式详解
2016/12/22 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
网上抓的一个特效
2007/05/11 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
浅析Python编写函数装饰器
2016/03/18 Python
浅谈python中set使用
2016/06/30 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python实现淘宝购物系统
2019/10/25 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
客服工作职责
2013/12/11 职场文书
远程教育心得体会
2014/01/03 职场文书
银行办理业务介绍信
2014/01/18 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
大学生交通专业求职信
2014/09/01 职场文书
财务统计员岗位职责
2015/04/14 职场文书
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
Python数据结构之队列详解
2022/03/21 Python