給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 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解釋 因為...