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"))
  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/9600990.html
Copyright © 2011-2022 走看看