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处理文本文件并生成指定格式的文件
Jul 31 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
selenium+python自动化测试环境搭建步骤
Jun 03 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
python函数不定长参数使用方法解析
Dec 14 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
python如何使用Redis构建分布式锁
Jan 16 Python
Python模块/包/库安装的六种方法及区别
Feb 24 Python
浅谈Python中的模块
Jun 10 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 Python
Python可视化学习之seaborn调色盘
Feb 24 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
python使用matplotlib绘制柱状图教程
2017/02/08 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
python3.5安装python3-tk详解
2019/04/26 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
2014升学宴答谢词
2014/01/26 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js