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

2022-09-14 04:00:10 字數 2891 閱讀 8567

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

示例:

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

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

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

方法一:暴力法

思路

逐個檢查所有的子字串,看它是否不含有重複的字元。

演算法

假設我們有乙個函式boolean allunique(string substring),如果子字串中的字元都是唯一的,它會返回true,否則會返回false。 我們可以遍歷給定字串s的所有可能的子字串並呼叫函式allunique。 如果事實證明返回值為true,那麼我們將會更新無重複字元子串的最大長度的答案。

現在讓我們填補缺少的部分:

為了列舉給定字串的所有子字串,我們需要列舉它們開始和結束的索引。假設開始和結束的索引分別為 iii 和 jjj。那麼我們有 0≤i0≤is的所有子字串。

要檢查乙個字串是否有重複字元,我們可以使用集合。我們遍歷字串中的所有字元,並將它們逐個放入set中。在放置乙個字元之前,我們檢查該集合是否已經包含它。如果包含,我們會返回false。迴圈結束後,我們返回true

public

class

solution

public

boolean allunique(string s, int start, int

end)

return

true

;   }

}

方法二:滑動視窗

演算法暴力法非常簡單。但它太慢了。那麼我們該如何優化它呢?

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

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

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

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

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

複雜度分析

方法三:優化的滑動視窗

上述的方法最多需要執行 2n 個步驟。事實上,它可以被進一步優化為僅需要 n 個步驟。我們可以定義字元到索引的對映,而不是使用集合來判斷乙個字元是否存在。 當我們找到重複的字元時,我們可以立即跳過該視窗。

也就是說,如果s[j]在[i,j]有與 j′重複的字元,我們不需要逐漸增加 [i,j]。 我們可以直接跳過[i,j] [i,

j′]'>[i,j′]

​′​​ 重複的字元,我們不需要逐漸增加 iii 。 我們可以直接跳過 [i,

j′]'>[i,j′]

範圍內的所有元素,並將 i變為 j′+1

public

class

solution

ans = math.max(ans, j - i + 1);

map.put(s.charat(j), j + 1);

}return

ans;}}

給定字串  pwwkew

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.給定字串,找到最長無重複字...