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 django事务transaction源码分析详解
Mar 17 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
Python中使用支持向量机SVM实践
Dec 27 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
python 输出所有大小写字母的方法
Jan 02 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
简单了解django缓存方式及配置
Jul 19 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
Python列表切片常用操作实例解析
Mar 10 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 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调用Java对象的方法
2006/10/09 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
offsetParent 算法分析
2010/04/05 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
Python 使用office365邮箱的示例
2020/10/29 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
教室布置标语
2014/06/26 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
2014年环保局工作总结
2014/12/11 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
四风之害观后感
2015/06/09 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
Pandas-DataFrame知识点汇总
2022/03/16 Python