Python3 無重復字符的最長子串的實現(xiàn)
題目:
給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。
示例:
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
思路:
這道題會很自然的想到暴力解法,就是按位遞增依次檢查子串是否重復,并記下目前最大的子串長度,如果重復就從下一位索引處的字符開始重新檢查。下面是代碼實現(xiàn):
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 最長子串的長度
max_len = 0
# 存放字符的字典
char_dict = {}
index = 0
while s[index:].__len__() >= max_len:
# 當前最長子串長度
current_len = 0
for item in s[index:]:
old_index = char_dict.get(item)
if old_index is not None:
index = old_index + 1
char_dict.clear()
break
char_dict[item] = index
index += 1
current_len += 1
if current_len > max_len:
max_len = current_len
return max_len
開始只是想跑通,沒想到超出了時間限制??雌饋泶a顯得是有點啰嗦,但是思路應該是沒有問題的,我們還是從遍歷的角度來優(yōu)化。
優(yōu)化:
在上面的代碼中,當遇到重復字符時,遍歷的起始點就往后挪一位,但其實兩個重復字符之間的部分是不會重復的,比如字符串fbacdadfeed,在第一次從 f 開始遍歷遇到重復字符即第二個 a 的時候,下一次遍歷不應該從 b 開始,而是應該從前一個重復字符的后一個字符即 c 開始。
確定思想,并多次優(yōu)化后的代碼如下:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_dict = {}
start, end, max_len = -1, 0, 0
str_len = s.__len__()
while end < str_len:
char = s[end]
if char in char_dict:
old_index = char_dict[char]
if old_index > start:
start = old_index
diff = end -start
if diff > max_len:
max_len = diff
char_dict[char] = end
end += 1
return max_len;
這里使用了內(nèi)置的.__len__()方法來獲取字符串長度而不是len(),并且使用了多個看似多此一舉的臨時變量來存儲值,比如char和diff,都是為了節(jié)省時間,蚊子小也是肉嘛。
結(jié)果也是 ok 的:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python機器學習NLP自然語言處理基本操作之京東評論分類
自然語言處理( Natural Language Processing, NLP)是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現(xiàn)人與計算機之間用自然語言進行有效通信的各種理論和方法2021-10-10
解決python matplotlib imshow無法顯示的問題
今天小編就為大家分享一篇解決python matplotlib imshow無法顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Pandas 重塑(stack)和軸向旋轉(zhuǎn)(pivot)的實現(xiàn)
這篇文章主要介紹了Pandas 重塑(stack)和軸向旋轉(zhuǎn)(pivot)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
用python3讀取python2的pickle數(shù)據(jù)方式
今天小編就為大家分享一篇用python3讀取python2的pickle數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
PyQt中實現(xiàn)自定義工具提示ToolTip的方法詳解
這篇文章主要為大家詳細介紹了PyQt中實現(xiàn)自定義工具提示ToolTip的方法詳解,文中的示例代碼講解詳細,對我們學習有一定幫助,需要的可以參考一下2022-05-05
Django框架靜態(tài)文件使用/中間件/禁用ip功能實例詳解
這篇文章主要介紹了Django框架靜態(tài)文件使用/中間件/禁用ip功能,結(jié)合實例形式詳細分析了Django框架靜態(tài)文件的使用、中間件的原理、操作方法以及禁用ip功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-07-07
flask post獲取前端請求參數(shù)的三種方式總結(jié)
這篇文章主要介紹了flask post獲取前端請求參數(shù)的三種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

