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

2021-10-07 05:02:53 字數 1852 閱讀 8873

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

示例 1:

輸入: 「abcabcbb」

輸出: 3

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

示例 2:

輸入: 「bbbbb」

輸出: 1

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

示例 3:

輸入: 「pwwkew」

輸出: 3

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

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

本題可用滑動視窗(雙指標),列舉 i

ii 為以 i

ii 為結尾的子串,找出最長的無重複字元的子串,也就等同於,找出最左的 jjj。

為了判定 [j,

i][j, i]

[j,i

] 之間是否有重複字元,可以使用雜湊表維護[j,

i][j, i]

[j,i

] 中每個字元出現的次數。

當然,如果 j

jj 每次都從 i

ii 遍歷到0,那麼整體的時間複雜度為 o(n

2)o(n^2)

o(n2

)。雙指標演算法的優化首先考慮其單調性,即 i

ii 增加1後,新的 j′j'

j′是否會出現在 j

jj 之前。

用反證法即可證明。如上圖所示,i

ii 增加1變為 i′i'

i′後,如果 j′′

j''j′

′ 滿足題意,使 [j′

′,i′

][j'', i']

[j′′,i

′]為最長的子串,且之間無重複字元,那麼可推 [j′

′,i]

[j'', i]

[j′′,i

] 之間也滿足之間無重複字元,這與 [j,

i][j, i]

[j,i

] 為最長的子串相悖。故可證之,i

ii 增加1變為 i′i'

i′後,j′j'

j′只能從 j

jj 開始列舉。

這就意味著,j

jj 一旦開始列舉後,可以不回頭一直往前走,這樣整體複雜度就降為 o(n

)o(n)

o(n)

。在實際實現中,i+1

i+1i+

1 時將對應的值 si+

1s_si+1

​ 移入表中,如果表中有重複,則意味著 si+

1s_si+1

​ 元素重複,將 s

js_j

sj​ 移除表,並執行 j=j

+1j = j + 1

j=j+

1 ,直至表中無重複的 si+

1s_si+1

​ 為止。

滑動視窗 o(n

)o(n)

o(n)

class

solution

return res;}}

;

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