def lengthoflongestsubstring(s):
d_map = {}
start = maxlength = 0
for i in range(len(s)):
if s[i] in d_map and start <= d_map[s[i]]:
start = d_map[s[i]] + 1
else:
maxlength = max(maxlength, i - start + 1)
d_map[s[i]] = i
return maxlength
s = "abcabcdbb"
print lengthoflongestsubstring(s)
在python中,或者在程式語言中,字典的的用處很多,會想起當初寫存活主機掃瞄,第一次用到c++的 map字典,當時驚為天人,第一次用到這麼高階的寫法,當時感覺真是方便,現在才發現,這個資料結構的用處很多,比如以上的這個演算法。
1.首先我們申請乙個空的字典,
2.然後定義申請乙個字串的最大長度maxlength和每個元素出現的開始首位值start,start這個值僅當字串中第二次出現時會變化,值等於都一次出現的位置加1即可。
3.開始迴圈,如果當前字元存在於字典中且start小於當前字元的值,start加上1,否則的話就求出迴圈到當前位置時最大的字串的長度。
4.最後返回最大字串長度
我們根據字典的特性,很好的求出了子串的長度。
本來我最初的思路是:
1.從第一位遍歷,求從這最大字串的長度,
2.然後每次儲存到字典,
3.最後求字典中的最大值
最後發現寫下來很複雜,而且很多情況沒有寫進去,就借鑑了別人的寫法,果然,時間複雜度降到了最低,也便利了了每個元素,字典中,只存的是字串,很棒的思路,感謝!
求最長子序列和最長公共子串
又有一段時間沒刷題,今天溫故下,最長公共子串行和最長公共子串概念不一樣,子串行可以不連續,子串必須連續,這兩題均可以用動態規劃解決!下面程式在vs上跑過無問題!include include include includeusing namespace std 動態規劃求最長子序列 int long...
求java無重複的最長子串
public static list getnorepeatstring string str 設定最長子串和其長度 maxlen nowlen longlists.add str.substring start,i 只要包含重複的字元,就更新map中的最新位置 將起始位置設定為重複字元第一次出現位...
字尾樹求最長子字串
問題描述 給定乙個文字檔案作為輸入,查詢其中的最長子字串。例如,ask not what your country can do for you,but what you can do for your country 中的 can do for you 就是最長子字串。解題過程 這個問題最直接的解...