LeetCode 3 無重複字元的最長子串

2022-06-17 23:15:09 字數 3018 閱讀 4184

題目:

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

示例 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.給定字串,找到最長無重複字...