功能:在乙個由[』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 的輸出,直到遇到結束符為止。每行依次輸...