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中的应用之translate和maketrans用法详解
Aug 27 Python
简洁的十分钟Python入门教程
Apr 03 Python
详解详解Python中writelines()方法的使用
May 25 Python
详解python进行mp3格式判断
Dec 23 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Django Rest framework权限的详细用法
Jul 25 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
PHP insert语法详解
2008/06/07 PHP
PHP 强制下载文件代码
2010/10/24 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
php面向对象重点知识分享
2019/09/27 PHP
js 深拷贝函数
2008/12/04 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
工作个人的自我评价
2014/01/14 职场文书
结婚周年感言
2014/02/24 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
初中班主任寄语
2014/04/04 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
导游词之五台山
2019/10/11 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL