給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: 「abcabcbb」示例 2:輸出: 3
解釋: 因為無重複字元的最長子串是 「abc」,所以其長度為 3。
輸入: 「bbbbb」示例 3:輸出: 1
解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。
輸入: 「pwwkew」本題可用滑動視窗(雙指標),列舉 i輸出: 3
解釋: 因為無重複字元的最長子串是 「wke」,所以其長度為 3。
請注意,你的答案必須是子串的長度,「pwke」 是乙個子串行,不是子串。
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.給定字串,找到最長無重複字...