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