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机器学习实战之K均值聚类
Dec 20 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python3射线法判断点是否在多边形内
Jun 28 Python
python每天定时运行某程序代码
Aug 16 Python
使用python+whoosh实现全文检索
Dec 09 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python批量修改xml属性的实现方式
Mar 05 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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动态生成VRML网页
2006/10/09 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
Linux中为php配置伪静态
2014/12/17 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
brook javascript框架介绍
2011/10/10 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
浅谈Python中的模块
2020/06/10 Python
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
写好自荐信的技巧
2013/11/08 职场文书
行政办公室岗位职责
2014/03/18 职场文书
药学职务聘任书
2014/03/29 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
项目投资建议书
2014/05/16 职场文书
优秀班组申报材料
2014/12/25 职场文书
继承公证书格式
2015/01/26 职场文书
内乡县衙导游词
2015/02/05 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android