LeetCode每天一题Longest Substring Without Repeating Characters(最长无重复的字串)

Posted goodrnne

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode每天一题Longest Substring Without Repeating Characters(最长无重复的字串)相关的知识,希望对你有一定的参考价值。

Given a string, find the length of the longest substring without repeating characters.

Example 1:           Input: "abcabcbb"                              Output: 3                           Explanation: The answer is "abc", with the length of 3. 

Example 2:           Input: "bbbbb"                                  Output: 1                            Explanation: The answer is "b", with the length of 

Example 3:           Input: "pwwkew"                              Output: 3                           Explanation: The answer is "wke", with the length of 3.

 

 

Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

 
解决思路
  对于这道题最简单的方法我们可以使用暴力破解法,尝试所有可能的搜索字串,然后得出最大的不重复字串,但是这种解法复杂度太高,遇到比较长的字符串时,可能直接TimeOut了,所以尝试有没有其他解法。
  另一种解法就是我们通过设置一个标志量来表示当前从哪一个位置的字串开始计算的和一个字典辅助空间来记录字符出现的位置,然后从头到尾遍历字串,先判断字符串是否存在字典中并且当前的下标需要大于等于标志量,满足的话取出最大的具体,然后设置当前具体,并且将标志量移动到字典中第一个重复出现的字符串的下一位。然后继续执行。
 
复杂度
  时间复杂度为O(n), 空间复杂度为O(n)(字典存储所耗费的空间较大,也估计为O())
 
图示步骤:

       
                                     技术图片
 
代码:
 1 class Solution(object):
 2     def lengthOfLongestSubstring(self, s):
 3         """
 4         :type s: str
 5         :rtype: int
 6         """
 7         if len(s) < 2:
 8             return 1 if len(s) == 1 else 0
 9         index, max_count = 0, 0              # 设置标志量和最大长不重复字段的数目
10         tem_dict, count = {}, 0              # 设置辅助空间字典和当前的技术器
11         for i, char in enumerate(s):         # 冲头开始遍历
12             if char in tem_dict and tem_dict[char] >= index:         # 如果当前字符在字典中并且字典中的下标大于等于标志量下标(标志量表示从哪一个字符开始计算的)
13                 max_count =max(count,max_count)                      # 求出最大的数
14                 count = i - tem_dict[char]                           # 算出第一个出现重复的字符串当第二次出现时的距离数。
15                 index = tem_dict[char]+1                  # 将标志量设置到第一次出现重复字符串的下一个。
16             else:
17                 count += 1                                           # 无重复字符出现,计数加1
18             tem_dict[char] = i                                       # 记录当前字符串下标
19         return max(count, max_count)                                 # 返回最大的距离数

 


以上是关于LeetCode每天一题Longest Substring Without Repeating Characters(最长无重复的字串)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode每天一题Jump Game(跳跃游戏)

每天一题LeetCode 0020. 有效的括号

LeetCode每天一题Next Permutation(下一个排列)

LeetCode每天一题Same Tree(相同的树)

LeetCode每天一题Group Anagrams(变位词组)

LeetCode每天一题 Valid Palindrome(有效的回文)