leecode3 無重複字元的最長子串

2022-06-23 03:21:13 字數 1389 閱讀 3083

1.題目描述

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

2.示例

示例 1:

輸入: s = "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是"abc",所以其長度為 3。

示例 2:

輸入: s = "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是"b",所以其長度為 1。

示例 3:

輸入: s = "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串

示例 4:

輸入: s = ""

輸出: 0

3.題目分析

(1)該問題的暴力解法是:設定乙個已訪問集合,從第乙個元素開始,每訪問乙個元素,就判斷它是否已經存在於已訪問的集合中。如果未訪問則將其加入到已訪問的集合中,

如果已訪問則證明當前字串出現重複元素,則記錄此時的最大長度,再回溯到第一次訪問的元素的後乙個元素,依次類推直到整個字串訪問結束。

(2)上述解法容易想到,但是效率不高。為了提高效率,進行改進。即——不回溯。每次除了記錄第乙個加入到已訪問的集合的元素,同時記錄已訪問的集合中是哪乙個元素出現重複,

出現重複的以後的元素全部是未重複元素,則此時重新整理最大長度,清空已訪問集合,下一次開始的元素即從重複的元素的後乙個開始即可。

(3)除上述避免回溯的方法之外,每次新的記錄時,還可以將未訪問的元素長度和當前已得到的最大長度比較,如果未訪問的元素長度小於等於已得到的最大長度,那麼後面將不需再

比較。因為即使後面的全部是未重複元素,那麼它的長度也不會超過當前已經得到的最大長度。

4.給出**

class

solution

}//未出現重複

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陣列儲存陣列的便利,將該位置之前所有的字元除去...