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 sys模块sys.path使用方法示例
Dec 04 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python 提取文件指定列的方法示例
Aug 07 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
python中线程和进程有何区别
Jun 17 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
Python实现8种常用抽样方法
Jun 27 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
ip签名探针
2006/10/09 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
Python实现SVN的目录周期性备份实例
2015/07/17 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
python集合删除多种方法详解
2020/02/10 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
团委书记的竞聘演讲稿
2014/04/24 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
教育见习报告范文
2014/11/03 职场文书
现役军人家属慰问信
2015/03/24 职场文书
民事答辩状格式范文
2015/05/21 职场文书
新学期开学寄语2016
2015/12/04 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers