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中super关键字用法实例分析
May 28 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python numpy 常用函数总结
Dec 07 Python
python实现xlsx文件分析详解
Jan 02 Python
python实现简单淘宝秒杀功能
May 03 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
Python selenium模块实现定位过程解析
Jul 09 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python 如何查找特定类型文件
Aug 17 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
Python面向对象编程之类的概念
Nov 01 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实现框架(一)
2006/10/09 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
Python中使用logging模块打印log日志详解
2015/04/05 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
服装厂厂长职责
2013/12/16 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
PHP策略模式写法
2021/04/01 PHP