1.題目描述
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
2.示例
示例 1:
輸入: s = "abcabcbb"示例 2:輸出: 3
解釋: 因為無重複字元的最長子串是
"abc",所以其
長度為 3。
輸入: s = "bbbbb"示例 3:輸出: 1
解釋: 因為無重複字元的最長子串是
"b"
,所以其長度為 1。
輸入: s = "pwwkew"
輸出: 3示例 4:解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串
輸入: s = ""3.題目分析輸出: 0
(1)該問題的暴力解法是:設定乙個已訪問集合,從第乙個元素開始,每訪問乙個元素,就判斷它是否已經存在於已訪問的集合中。如果未訪問則將其加入到已訪問的集合中,
如果已訪問則證明當前字串出現重複元素,則記錄此時的最大長度,再回溯到第一次訪問的元素的後乙個元素,依次類推直到整個字串訪問結束。
(2)上述解法容易想到,但是效率不高。為了提高效率,進行改進。即——不回溯。每次除了記錄第乙個加入到已訪問的集合的元素,同時記錄已訪問的集合中是哪乙個元素出現重複,
出現重複的以後的元素全部是未重複元素,則此時重新整理最大長度,清空已訪問集合,下一次開始的元素即從重複的元素的後乙個開始即可。
(3)除上述避免回溯的方法之外,每次新的記錄時,還可以將未訪問的元素長度和當前已得到的最大長度比較,如果未訪問的元素長度小於等於已得到的最大長度,那麼後面將不需再
比較。因為即使後面的全部是未重複元素,那麼它的長度也不會超過當前已經得到的最大長度。
4.給出**
classsolution
}//未出現重複
visitedset->push_back(startpos);
startpos++;
tempmaxlength++;
}if(maxlengthtempmaxlength;//說明最後一次長度最大,沒有經過重複。
return
maxlength;
}};
5.總結
(1)**急於實現,導致**邏輯不夠清晰
(2)雖然相較於暴力解法,時間複雜度有所降低,但是時間效率仍不高。主要浪費在每次和已訪問集合的查重上。
(3)如果想讓時間複雜度進一步降低,則需要思考如何不每次遍歷查重,可以直接和對應的比較。
(4)最後,需要注意不以出現重複為最大長度的情況。
Leecode3 無重複字元的最長子串
題目說明 如,在 abcabcbb 中,其無重複字元的最長子字串是 abc 其長度為 3 對於,bbbbb 其無重複字元的最長子字串為 b 長度為1。基本思路 遍歷該字串,往集合裡面插入元素 1 插入成功,說明無重複,繼續插入 2 插入不成功時,元素有重複,記錄當前最大長度,查詢與當前元素重複的前面...
LeeCode3 無重複字元的最長子串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。1.暴力法 public intlengthoflongestsubstring string s char ss s.tochararray int len ss.length setset newhashset int max len...
leecode 無重複字元的最長子串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。題解 因為題目中所有的字元都是字元,字元的ascall碼不大於300,用乙個300的word陣列來儲存,每個字元在字串中的位置,當字元重複時,將該字元首次出現的字元的位置求解出來,利用word陣列儲存陣列的便利,將該位置之前所有的字元除去...