查詢最長不重複子串

2021-08-28 07:46:09 字數 1519 閱讀 8522

功能:在乙個由[』a-z』][『a-z』][『0-1』]組成的字串中查詢字母不重複的最長字串

要求:空間與時間複雜度最低

思路:在題目明確指出字母確定的情況下,一般這個題目會考慮使用位圖或者map之類的結構體輔助解題。暴力法的時間複雜度會很高,資料只訪問一次是最理想的結果,比較當前找到的字串長度與最大的長度->cur_len,max_len;採用額外的空間,分別比較list中的字元,或者動態更改list中的字串,不如直接使用begin,end直接遍歷原字串;剩下如何確認該字串長度,將當前的索引位置-上次出現的位置

**:

#@author tangjin

#@date 2018-09-21

import string

#思想:1.以dictionry鍵值對儲存的方式儲存字母在整個字串中的位置;

#2.以字母當前的位置減去上一次出現的位置獲得基於該字母最大長度;

#3.以end begin儲存最長字串出現的起始與結束位置

def lengthoflongsubstring(s):

begin = 0 #最長字串開始下標

end = 0 #最長字串結束下表

cur_len = 0 #當前字串長度

pre_loc = -1 #該字元的上乙個位置,python陣列從0開始計算

max_len = 0 #最長字串的長度

#ele_loc_dict初始化,將所有的值都賦值為-1

letter_list = string.ascii_letters

number_list = string.digits

ele_loc_dict={}

for i in range(len(letter_list)):

ele_loc_dict[letter_list[i]] = -1

for i in range(len(number_list)):

ele_loc_dict[number_list[i]] = -1

for index in range(len(s)):

if pre_loc < ele_loc_dict[s[index]]:

pre_loc = ele_loc_dict[s[index]]

# 當前索引-之前位置,得到根據該字母獲得的子串長度

cur_len = index-pre_loc

if max_len<=cur_len:

begin=pre_loc+1

end=index

max_len = cur_len

#更新必須放在最後一步,將字母對應的loaction更新

ele_loc_dict[s[index]]=index

print(s[begin:(end+1)])

lengthoflongsubstring('abcdefa')

lengthoflongsubstring('abc1ade1fa13')

執行結果:

bcdefa

bc1ade

最長不重複子串

出處 勇幸 thinking 題 從乙個字串中找到乙個連續子串,該子串中任何兩個字元不能相同,求子串的最大長度並輸出一條最長不重複子串。本節從最直接的方法逐步優化,漸進探索了四種實現方式,並最終找到時間複雜度為o n 輔助空間為常數的方案,內容如下 基本演算法 使用hash dp方案 dp hash...

最長不重複子串

演算法參考 找到乙個字串中的乙個連續子串,這個子串內不能有任何兩個字元是相同的,並且這個子串是符合要求的最長的。例如輸入 abcbef 輸出 cbef o n 的演算法,具體思路如下 以abcbef這個串為例,用乙個陣列pos記錄每個元素曾出現的下標,初始化為 1。從s 0 開始,依次考察每個字元,...

最長不重複子串

題目鏈結 給定乙個字串,找到最長的子串,要求該子串中沒有重複的字元。例如 字串abcabcbb的不含重複字元的 最長 子串為abc,長度為 3。而bbbbbb的不含重複字元的 最長 子串為b,長度為 1。輸入格式 輸入包含多行,每一行對應乙個長度不超過 100 的輸出,直到遇到結束符為止。每行依次輸...