題目:
給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。
思路:
無重複,最長子串。首先想到的是遍歷字串比較,不存在相同key, length長度就+1,如果存在則移位,從下一位開始繼續比較。
方法一:
class solution(object):
def lengthoflongestsubstring(self, s):
""":type s: str
:rtype: int
"""length = upper = lower = 0 #長度變數初始賦值
while upper < len(s):
if s[upper] not in s[lower:upper]: #依次遍歷字串單個位元組內容,是否在字串範圍中
upper +=1 #不在,下限+1,往下位繼續遍歷
length = max(length,len(s[lower:upper])) #獲得當前已遍歷出的子串的最大長度
else:
lower +=1 #當字串範圍包含位元組時,上限+1,跳過該位,往下位開始重新遍歷
return length
執行用時 :84 ms, 在所有 python 提交中擊敗了39.60%的使用者
記憶體消耗 :12.8 mb, 在所有 python 提交中擊敗了15.15%的使用者
看起來這是笨方法,雖然我不懂演算法最優解計算邏輯,但是明顯感覺到這個方法每次都會從頭開始遍歷,有點浪費時間。
方法二:
思路:方法一是通過字串的index 來移位,那我可不可以通過array來做類似的事情呢?當然可以
class solution(object):
def lengthoflongestsubstring(self, s):
""":type s: str
:rtype: int
"""tmp=
cur_len= max_len =0
if len(s)==0:return 0
for i in range(len(s)):
if s[i] in tmp:
j=tmp.index(s[i])#求相同字元s[i]在tmp中的index
tmp=tmp[j+1:] #移位,將list更新為最新的子字串
cur_len-=j #更新子字串長度
else:
cur_len+=1
max_len=max(cur_len,max_len)
return max_len
執行用時 :76 ms, 在所有 python 提交中擊敗了46.05%的使用者
記憶體消耗 :13.6 mb, 在所有 python 提交中擊敗了6.06%的使用者
方法三:
怎麼才能節省時間呢?
方法一用了str,方法二用了array,那麼用dic 會怎樣?
思路:下面的方式通過dic 標記相同元素位置,相同元素出現前獲取當前片段最大長度,出現相同元素時,理解成區間擷取,擷取出現相同元素index之前的區間部分肯定沒有上一次的長度長,這部分可以捨棄,所以只需要記錄出現相同元素後的index 位置在繼續遍歷,最後取長度最大值即可。
class solution(object):
def lengthoflongestsubstring(self, s):
""":type s: str
:rtype: int
"""# 可拋棄字串的索引尾值 - 字串索引值,該索引值以及之前的字元都屬於重複字串中的一部分,不再在計算中涉及
ignore_str_index_end = -1
dic = {} # 任意字元最後出現在索引的位置 -
max_length = 0 # 最長字串長度
for i, c in enumerate(s):
# 如果字典中已經存在字元c,則字元c重複
# 如果字元索引值大於ignore_str_index_end,則字元c在需處理的範圍內(補充說明請參考備註一)
if c in dic and dic[c] > ignore_str_index_end:
# 先更新可拋棄字串的索引尾值為字元c上一次的索引值
ignore_str_index_end = dic[c]
# 再更新字元c的索引值
dic[c] = i
# 否則,
else:
# 更新字元最近的索引位置
dic[c] = i
# 更新最大長度
max_length = max(i - ignore_str_index_end, max_length)
return max_length
執行用時 :72 ms, 在所有 python 提交中擊敗了49.95%的使用者
記憶體消耗 :13 mb, 在所有 python 提交中擊敗了6.06%的使用者
時間方面還是很長,放棄~。~重在理解演算法思路。
leetcode 3 無重複的字串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...
leetcode 3 無重複字元的最長字元子串
堅持打卡!題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwk...
leetcode 3 最長無重複字串
3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...