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面相对象编程中对象的属性与类的方法
Jan 19 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
Python实现的求解最小公倍数算法示例
May 03 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
进行数据处理的6个 Python 代码块分享
Apr 06 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
珊瑚虫IP库浅析
2007/02/15 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python实现倒计时的示例
2014/02/14 Python
Python随机生成数模块random使用实例
2015/04/13 Python
使用Python生成url短链接的方法
2015/05/04 Python
python在非root权限下的安装方法
2018/01/23 Python
利用python修改json文件的value方法
2018/12/31 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
领导班子四风表现材料
2014/08/23 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
土建技术员岗位职责
2015/04/11 职场文书
公司员工奖惩制度
2015/08/04 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
python实现剪贴板的操作
2021/07/01 Python