• LeetCode,3. 无重复字符的最长子串


    看了各位大神的,真是难堪,尤其是各种c++动不动就击败99%。。。
    我用python,换了三次算法,改了十几次bug,才击败5%。。。。
    贴出来纪念下吧。

    题目如下:


    给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度。


    示例?1:

    输入: "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。


    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。


    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是?"wke",所以其长度为 3。
    ?

    请注意,你的答案必须是 子串 的长度,"pwke"?是一个子序列,不是子串。




    对s="ojyseenuxxpohrysqixldpki"的纸面运算模拟:

     1 def lengthOfLongestSubstring(self, s: str) -> int:
     2          #该函数思路为:从头到尾逐个移动字符,添加到临时字符串中,如果临时字符串已经包含该字符,则剪切至sc列表中保存,并临时字符串清空,重新待填充
     3         sc=[]   #列表方式
     4         temps={}#临时字典,按字符头+临时字符串方式
     5         maxlen=0
     6         
     7         for x in s:
     8             if x not in sc:#如果该字母在sc字典中不存在以该字母为首字母序列的列表的,则创建之,并填充
     9                 sc.append(x) 
    10                 temps[x]=x
    11             for y in list(temps.keys()):#对临时字符串字典中的key进行遍历
    12                 if x in temps[y]:#如果在临时字符串里面有x,则把不重复的字符串添加到sc
    13                     if temps[y] not in sc:
    14                         sc.append(temps[y])
    15                     if x==y:#填充完后,对临时字符串进行处理,
    16                         temps[y]=x#对于abc遇到a这种,abc上sc,然后临时字符串a重新从a字符开始
    17                     else:
    18                         temps[y]=""#对于abc遇到c这种,abc上sc,然后临时字符串a清空,因为下一个字符是c,临时字符串c可能不为空,不能随便覆盖
    19                 else:
    20                     if temps[y]!="" or (y==x and temps[y]==""):#对于临时字符串如果不为空,则增加字符,对于被清空的字符串,如果字符头和遇到的字符一样,则同意添加
    21                         temps[y]=temps[y]+x
    22                    
    23         for y1 in list(temps.keys()):#运行完成后,再回头把所有temps筛选不重复的填充进sc
    24             if temps[y1] not in sc:
    25                 sc.append(temps[y1])
    26         #print(sc)
    27         for x1 in sc:#从sc列表中选取最长的字符串,求长度并返回
    28             if len(x1)>maxlen:
    29                     maxlen=len(x1)
    30         return maxlen

    心得体会:

    1、必须纸面模拟,否则直接写,很多地方难以理解为什么,比如临时字符串什么时候清空,什么时候保留一个字符,前面两个算法都没想明白,模拟后发现了差别。

    2、list好虽好,但在for循环中,获取最后一个元素没有现成方法,遗憾。(如果x==s[-1:],会有重复的,如果是for用数字循环,则又不值得)

  • 相关阅读:
    一二线城市知名 IT 互联网公司名单!
    分布式理论- CAP定理
    Linux中安装ActiveMQ完整教程
    Nginx安装-配置负载均衡
    基于SpringBoot+Vue在线学习系统实现
    序列化多个对象和反序列化遍历一个文件中的所有对象原理讲解
    从源码看懂HashMap
    Mac在已有jdk1.8的环境下安装jdk1.6
    mac通过Parallels Desktop虚拟机实现共享windows独有软件提供的特殊网络
    算法题汇总
  • 原文地址:https://www.cnblogs.com/telephoner/p/11956621.html
Copyright © 2020-2023  润新知