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"))

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM