最長無重複子串的DP實現

2021-06-27 09:17:40 字數 719 閱讀 9213

這道題能算dp嗎?那要看是否具備最優子結構。我的分析是沒有明顯的子結構性質。

例如當求下標為 i 的最長無重複子串時,要考慮兩類情況。(len表示當前處理的子串的長度)

(1) s[ i ] 是否在字串s之前的位置出現過,如果沒有則長度 len++ ;

(2) 如果出現過,分兩種情況討論(出現在當前處理的子串中?)

a> 是。那好辦,直接更新len = i -  [出現位置下標] ;

b> 否。更好辦,直接更新 len++。

分析可見,並沒有什麼最優子結構,dp也談不上吧。

資料結構:

可採用c++11的unordered_map,這個可以在常數時間內找到某個元素(map的紅黑樹實現需要logn),但是否足夠好?不然,陣列更好,高階一點可用c++11的array,還不用處理hash衝突。所有的字元不過256而已。空間、時間都是一流的。

需要注意的是用陣列,一要清0,二要注意下標操作。下標不能從0開始,否則就無法判斷第乙個元素是否出現,會被預設為沒有出現。舉個例子:abcdaefghi,如果下標從0那麼a的重複就不會發現,你得到的是整個序列的長度,而實際最長的aefghi。

上篇的1000多個測試用例的時間為380ms,這裡的為144ms,節省了一半還多。

int lengthoflongestsubstring(string s) 

return maxlen;

}

最長無重複子串

examples given abcabcbb the answer is abc which the length is 3.given bbbbb the answer is b with the length of 1.given pwwkew the answer is wke with t...

最長無重複子串

給定乙個字串,請找出其中無重複字元的最長子字串。例如,在 abcabcbb 中,最長無重複子串為 abc 其長度為3。在 pwwkew 最長無重複子串為 wke 其長度為3。注意是是子串,pwke 是子串行而不是子串。leetcode 首先試了試暴力搜尋,遍歷一次字串,遍歷過程中,對每個字元都有乙個...

最長無重複子串

最長無重複子串 兩種思路 一種是暴力解法 一種是動態規劃 package merchant public class maxnorepeat int record 0,maxlen 1,index 0 for int i 1 ilength i else len if maxlenreturn s....