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计算程序运行时间的方法
Dec 13 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
Python表示矩阵的方法分析
May 26 Python
安装Python的教程-Windows
Jul 22 Python
Python数据分析模块pandas用法详解
Sep 04 Python
Python3实现二叉树的最大深度
Sep 30 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
Python字符串及文本模式方法详解
Sep 10 Python
Python 列表推导式需要注意的地方
Oct 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
Windows下的PHP5.0详解
2006/11/18 PHP
php mysql数据库操作分页类
2008/06/04 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php链表用法实例分析
2015/07/09 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
Python如何进行时间处理
2020/08/06 Python
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
安全生产大检查方案
2014/05/07 职场文书
理发店策划方案
2014/06/05 职场文书
应急处置方案
2014/06/16 职场文书
迟到检讨书范文
2015/01/27 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB