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基础教程之python消息摘要算法使用示例
Feb 10 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
用python写的一个wordpress的采集程序
Feb 27 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Python中optparser库用法实例详解
Jan 26 Python
分析python请求数据
Aug 19 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
Python调用服务接口的实例
Jan 03 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
php验证码生成代码
2015/11/11 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
禁止空格提交表单的js代码
2013/11/17 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python logging日志模块的详解
2017/10/29 Python
python Tkinter的图片刷新实例
2019/06/14 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
企业宣传口号
2014/06/12 职场文书
党员志愿者活动方案
2014/08/28 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
花木兰观后感
2015/06/10 职场文书
Python中22个万用公式的小结
2021/07/21 Python