zoukankan      html  css  js  c++  java
  • leetcode 无重复字符的最长子串 python实现

    这道题需要借助哈希查找key的O(n) 时间复杂度, 否则就会超时

       初始化一个 哈希表字典  dic

    头指针start 初始为0

    当前指针 cur 初始为0

    最大长度变量 l 初始为0

      用cur变量从给定字符串str的开头开始 一位一位的向右查看字符,直到整个字符串遍历完, 对每一位字符进行如下:

        当前位置的字符为 c = str[cur]

        查询当前字符 c 是否 在哈希表dic的键 当中,表示 当前字符c 是否之前遍历到过

           如果 当前字符还没出现过,就 在dic中记录一个键值对  (当前字符c,当前位置cur )

          cur 后移一位

           如果 当前字符出现过, 获取 当前字符串c 上次出现的位置 pre = dic[c]

          如果pre 在 start后面即 pre>start, 则把start 移动到 pre的下一位, start = pre + 1, 这样保证cur继续向后遍历中 从start到cur没有重复元素

          否则 start不动,start移动到某一个位置,说明在这个位置之前有重复的元素了,所以start只往后移动不往回移动

        这时候在衡量一下  如果 cur - start + 1 (衡量当前没重复子串开头到结尾的长度) 比 长度变量 l 大, 那就替换 l 为  cur - start + 1

          

        

     1 class Solution:
     2     def lengthOfLongestSubstring(self, s):
     3         """
     4         :type s: str
     5         :rtype: int
     6         """
     7         l = 0
     8         start = 0
     9         dic = {}
    10         for i in range(len(s)):
    11             cur = s[i]
    12             if cur not in dic.keys():
    13                 dic[cur] = i
    14             else:
    15                 if dic[cur] + 1 > start:
    16                     start = dic[cur] + 1
    17                 dic[cur] = i
    18             if i - start + 1 > l:
    19                 l = i - start + 1
    20 
    21         return l
    22 
    23 
    24 if __name__ == '__main__':
    25     s = Solution()
    26     # print(s.lengthOfLongestSubstring("abcabcbb"))
    27     # print(s.lengthOfLongestSubstring("abba"))
    28     print(s.lengthOfLongestSubstring("aabaab!bb"))
    29     # print(s.lengthOfLongestSubstring("bbbbb"))
  • 相关阅读:
    (转)SpringMVC学习总结
    Golang-函数的defer
    Golang-闭包
    Golang-匿名函数
    Golang-init()
    Golang-递归
    Golang-函数、包、变量的作用域
    Golang-for、break、continue、goto、return
    Golang-程序流程控制 if、switch
    Golang-进制、源码反码补码、位运算
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/9600990.html
Copyright © 2011-2022 走看看