方法一:動態規劃
d[i] = (s[i]是否與d[i-1]中的字元重複?找到重複的位置,d[i]等於兩者相減:d[i-1]+1)
問題一:如何判斷是否重複?
使用map或set
問題二:如何找到重複的位置?
使用map,其key = 字元,其value=位置。
問題三:需要每個d[i]都配乙個map嗎?
並不需要,一次遍歷,判斷d[i-1]的長度時候落在了當前重複字的區間內.
,如果出現新的重複,將其更新即可。
時間複雜度為o(n),空間複雜度為o(n)
方法二:雙指標
使用兩根起始位置在字串頭的指標i,p2。i先移動,當遇到重複的字母時,開始記錄len1 = i-重複處的位置,len2=i-p,用max和len2比較,如果len1>=len2,就另p移動到重複處+1的地方,否則不改變p1的位置。
注意,最後要比較一下最後乙個不重複的字串和當前max的值。
雙指標也比較適和求連續的字串這種問題,但是雙指標的初始位置和移動路徑應該如何安排,這個一定要想清楚。
第一種方法:
class
solution
mapmap =
newhashmap
<
>()
;for
(int i =
1;i)else
}else
map.
put(cur,i-1)
;}int maxlen =0;
for(
int i =
0;i)return maxlen;
}}
第二種方法:
class
solution
} map.
put(cur,i);}
max = math.
max(s.
length()
-p1,max)
;return max;
}}
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解釋 因為...