給定乙個字串,找出不含有重複字元的最長子串的長度。
示例:
給定"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_sij 已經被檢查為沒有重複字元。我們只需要檢查 s[j]s[j]s[j] 對應的字元是否已經存在於子字串 sijs_sij 中。
要檢查乙個字元是否已經在子字串中,我們可以檢查整個子字串,這將產生乙個複雜度為 o(n2)o(n^2)o(n2) 的演算法,但我們可以做得更好。
通過使用 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給定字串 pwwkewclass
solution
ans = math.max(ans, j - i + 1);
map.put(s.charat(j), j + 1);
}return
ans;}}
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.給定字串,找到最長無重複字...