3 無重複字元的最長子串

2021-09-29 21:27:45 字數 1341 閱讀 9974

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

示例 1:

輸入: "abcabcbb"

輸出: 3

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

示例 2:

輸入: "bbbbb"

輸出: 1

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

示例 3:

輸入: "pwwkew"

輸出: 3

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

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

第一種思路:我剛開始的思路就是利用暴力列舉。怎麼列舉呢?首先我們要找乙個字串的子集,需要確定兩個變數,子集的起始位置和大小。這樣我們就可以得到乙個字串的所有子集。

class solution 

return true;

}public int lengthoflongestsubstring(string s) }}

return ans;

}}

但時間複雜度接近o(n^3),所以很可能tle。

第二種思路:來自官方解答,利用滑動視窗的思想,

在暴力法中,我們會反覆檢查乙個子字串是否含有有重複的字元,但這是沒有必要的。如果從索引 i到 j−1之間的子字串 sij已經被檢查為沒有重複字元。我們只需要檢查 s[j] 對應的字元是否已經存在於子字串 sij中。

要檢查乙個字元是否已經在子字串中,我們可以檢查整個子字串,這將產生乙個複雜度為 o(n^2)的演算法,但我們可以做得更好。

通過使用 hashset 作為滑動視窗,我們可以用 o(1) 的時間來完成對字元是否在當前的子字串中的檢查。

滑動視窗是陣列/字串問題中常用的抽象概念。 視窗通常是在陣列/字串中由開始和結束索引定義的一系列元素的集合,即 [i,j)(左閉,右開)。而滑動視窗是可以將兩個邊界向某一方向「滑動」的視窗。例如,我們將 [i,j)向右滑動 1個元素,則它將變為 [i+1,j+1)(左閉,右開)。

回到我們的問題,我們使用 hashset 將字元儲存在當前視窗 [i,j)(最初 j=i)中。 然後我們向右側滑動索引 j,如果它不在 hashset 中,我們會繼續滑動j。直到 s[j] 已經存在於 hashset 中。此時,我們找到的沒有重複字元的最長子字串將會以索引 i 開頭。如果我們對所有的 i這樣做,就可以得到答案。

class solution 

else

set.remove(s.charat(i++));

}return ans;

}}

3 無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。思路 用 i...

3 無重複字元的最長子串

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

3 無重複字元的最長子串

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