3 無重複字元的最長子串

2021-10-14 13:39:31 字數 1723 閱讀 8970

題目描述

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

示例1

輸入: s = "abcabcbb"

輸出: 3

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

示例2
輸入: s = "bbbbb"

輸出: 1

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

示例3
輸入: s = "pwwkew"

輸出: 3

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

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

示例4
輸入: s = ""

輸出: 0

題解:

法一:使用乙個陣列 pos 記錄字元最近一次出現的位置,pre 表示必須以 s[i-1] 字元結尾的情況下,最長無重複字元子串起始位置的前乙個位置,初始時 pre=-1 。

法一**:

class

solution

return ret;}}

;/*記憶體:7.2mb,擊敗:87.20%

*/

法二:

雙指標。

定義兩個指標 i,j

(i

<=j

)i,j(i<=j)

i,j(

i<=j

),表示當前掃瞄到的子串是[i,

j]

[i,j]

[i,j

] (閉區間)。掃瞄過程中維護乙個雜湊表hash,表示 [i,

j]

[i,j]

[i,j

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

線性掃瞄時,每次迴圈的流程如下:

指標 j

jj 向後移一位, 同時將雜湊表中 s[j

]s[j]

s[j]

的計數加一:hash[s[j]]++;假設 j

jj 移動前的區間 [i,

j]

[i,j]

[i,j

] 中沒有重複字元,則 j

jj 移動後,只有 s[j

]s[j]

s[j]

可能出現2次。因此我們不斷向後移動 i

ii,直至區間 [i,

j]

[i,j]

[i,j

]中 s[j

]s[j]

s[j]

的個數等於1為止;

複雜度分析:由於 i,j

i,ji,

j 均最多增加n次,且雜湊表的插入和更新操作的複雜度都是 o(1

)o(1)

o(1)

,因此,總時間複雜度 o(n

)o(n)

o(n)

法二**:

class

solution

;int ret =0;

for(

int i =

0, j =

0; s[j]

;++j )

return ret;}}

;/*記憶體:7.2mb,擊敗:86.96%

*/

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解釋 因為...