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实现马耳可夫链算法实例分析
May 20 Python
python字典的常用操作方法小结
May 16 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
如何用python整理附件
May 13 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
Python远程视频监控程序的实例代码
May 05 Python
python 函数中的内置函数及用法详解
Jul 02 Python
pandas的相关系数与协方差实例
Dec 27 Python
详解Python的三种拷贝方式
Feb 11 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
Selenium常见异常解析及解决方案示范
Apr 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
第一节--面向对象编程
2006/11/16 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
JS实现移动端在线签协议功能
2019/08/22 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python提取频域特征知识点浅析
2019/03/04 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
初任培训自我鉴定
2013/10/07 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
入党函调证明材料
2015/06/19 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python