LeetCode 3 無重複字元的最長子串

2021-08-18 14:47:39 字數 2076 閱讀 5059

題目:

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

示例:給定"abcabcbb",沒有重複字元的最長子串是"abc",那麼長度就是3。

給定"bbbbb",最長的子串就是"b",長度是1。

給定"pwwkew",最長子串是"wke",長度是3。請注意答案必須是乙個子串,"pwke"是 子串行 而不是子串。

不重複可以用

list的contains(object obj)實現,後面就很簡單了,定義max為最長字串長度,初值為0。從起點開始不斷掃瞄,contains(obj)返回false就將其加入list,返回true就計算list長度,與max比較。接下來將起點+1同時clear()掉list,繼續這個過程即可,**就不貼了,比較簡單。出乎意料,這樣的暴力法也ac了,但是用時很長(超過5%的ac**)。

接下來就是想如

何去優化它。

不重複可以用雜湊表實現,因為ascii碼只有256個(題目中用到更少),只要定義乙個大小為256的boolean陣列hash,有字元c則將hash[c]置為true。

list也是而安全可以不用的,以為hash陣列已經記錄了list中的內容,我們只需另外定義乙個整數window(可以理解為視窗)作為方法一中list的長度,當出現重複時將max與window大者賦給max即可。

在方法一中將list清空相當於將之前的工作全部作廢了,其實可以保留部分。例如,對於串"bacdaea"

進行到第二個 a 時不必將hash陣列全部置為false,只要將第乙個a前面的元素對應位置置為false(即hash[(int)b]=false),同時調整當前視窗大小即可。

我用串"bacdaea"

進行舉例,初始時 window=0,,max=0,hash陣列全為false。

遍歷字串,從i=0到i=3,window和max都逐步增加到4,hash陣列下標為「b","a","c","d"的 boolean 值都為true,不重複的字串為"bacd"。

i = 4,此時掃瞄到"a",hash[a]=true,則從i-window=0開始尋找第乙個"a",找到位置記作start=1,遍歷 [i-window,start) 區間的字元charc,令hash[charc]=false,最後將window調整為i-start=3。此時不重複的字串為」cda"。

i = 5,"e"不重複,置hash[(int)e]=true,window變為4,不大於max,max不變,此時字串為"cdae".

i = 6,類似i=4時,start=4,window變為2,到這裡原字串就遍歷完了,最後返回max=4即可。**如下:

class solution 

}return max;

}}

我的**執行時間是36ms,超過91%ac**。然而最快的**只需要26ms,我看完後發現與我的思路相似,但是去掉了不必要的步驟。

方法三:

仔細觀察字串"abcdacebde",當我們掃瞄

到第二個字元"a"時,我們發現了重複的"a",自然的視窗移動到「a"後,變為"bcda",再移到"c"時,同樣視窗移動為"dac",可以發現我們只要比較視窗中的所有字元與當前字元(第i個)是否相等就好了,無重複則視窗+1,有重複則視窗移動,即:視窗右端恆定+1,左端不移動或者移動到重複字元之後。

這樣分析就知道了hash陣列是沒有必要的,我們只要定義視窗的左右left和right就可以到我們的目的。

我們只要從視窗左端left向右挨個字元和第i個字元比較,如果都不等,則left不變;如果找到乙個charat(j) = charat(i),令left = j+1即可。**如下:

class solution 

}longest = math.max(longest, right + 1 - left);

right++;

}return longest;

}}

leetcode 3 無重複的字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

leetcode 3 無重複字元的最長字元子串

堅持打卡!題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwk...

leetcode 3 最長無重複字串

3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...