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 变量类型及命名规则介绍
Jun 08 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
详解Python如何生成词云的方法
Jun 01 Python
Django开发中的日志输出的方法
Jul 02 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
Python绘制股票移动均线的实例
Aug 24 Python
python字符串的拼接方法总结
Nov 18 Python
PyTorch-GPU加速实例
Jun 23 Python
详细分析Python collections工具库
Jul 16 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 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中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
php教程之phpize使用方法
2014/02/12 PHP
PHP中的替代语法简介
2014/08/22 PHP
Linux中为php配置伪静态
2014/12/17 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
浅析vue-router原理
2018/10/19 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python获取服务器响应cookie的实例
2018/12/28 Python
Django框架实现的分页demo示例
2019/05/25 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
python实现网页录音效果
2020/10/26 Python
详解python的变量缓存机制
2021/01/24 Python
python装饰器代码深入讲解
2021/03/01 Python
园林毕业生自我鉴定范文
2013/12/29 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
法院授权委托书格式
2014/09/28 职场文书
读后感作文评语
2014/12/25 职场文书
教师培训简讯
2015/07/20 职场文书