GitHub: https://github.com/zhangjipinggom/LeetCode
1. 问题描述:
2. 解决办法:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
length = len(s)
if length == 0 or length == 1:
return length
else:
for out_int in range(length, 0, -1):
for offset in range(length - out_int + 1):
substring = s[offset: offset + out_int]
if len(set(substring)) == len(substring):
return out_int
def lengthOfLongestSubstring2(self, s):
"""
:type s: str
:rtype: int
"""
start, maxLength = 0, 0
usedChar = {}
for i in range(len(s)):
if s[i] in usedChar and usedChar[s[i]] >= start: # this is the condition renew the start
start = usedChar[s[i]] + 1
else:
maxLength = max(maxLength, i - start + 1)
usedChar[s[i]] = i
return maxLength
def lengthOfLongestSubstring3(self, s):
"""
:type s: str
:rtype: int
"""
longest, start, visited = 0, 0, [False for _ in range(256)] # ASCII is 8 bit
for i, char in enumerate(s):
if visited[ord(char)]: # ord("a") Return the Unicode code point for a one-character string
while char != s[start]:
visited[ord(s[start])] = False
start += 1
start += 1
else:
visited[ord(char)] = True
longest = max(longest, i - start + 1)
return longest
3. 个人记录:
(1) 方法1是自己第一时间想到的,非常暴力,不断向右平移,max_length从大到小,遇到最大的直接返回,这样的问题在于:
时间复杂度和空间复杂度都很高,极端的情况,时间复杂度为O(n**2), 空间复杂度为O(n)。
但是对于那种max_length == length 的情况就会很快;
(2)时间复杂度减少,利用的点:dict对于同一个key自动更新其值;
但是特别需要注意第一个判断条件
(3)时间复杂度比方法2多了一个常数,但是空间复杂度对于很长的那种字符串就减少了很多,不管你的字符串有多长,我的八位的ASCII字符足以对付
方法2和方法3豆要特别注意start的位置及如何更新