40
40
41
41
## 解法
42
42
43
- “滑动窗口 + 哈希表”。
43
+ ** 方法一:双指针 + 哈希表**
44
44
45
- 定义一个哈希表记录当前窗口内出现的字符,i、j 分别表示不重复子串的结束位置和开始位置,res 表示无重复字符子串的最大长度 。
45
+ 我们用双指针 $j$ 和 $i$ 分别表示子串的左右边界,其中 $j$ 是滑动窗口的左边界,$i$ 是滑动窗口的右边界,用哈希表 $vis$ 记录每个字符是否出现过 。
46
46
47
- 遍历 i,若 ` [j, i - 1] ` 窗口内存在 ` s[i] ` ,则 j 循环向右移动,更新哈希表,直至 ` [j, i - 1] ` 窗口不存在 ` s[i] ` ,循环结束。将 ` s[i] ` 加入哈希表中,此时 ` [j, i] ` 窗口内不含重复元素,更新 res 的最大值: ` res = max(res , i - j + 1)` 。
47
+ 遍历字符串 $s$,如果此时 $s [ i ] $ 在哈希表 $vis$ 中存在,说明 $ s[ i] $ 重复了,我们需要将左边界 $j$ 右移,直到 $s [ i ] $ 不在哈希表 $vis$ 中为止,然后将 $ s[ i] $ 加入哈希表 $vis$ 中。此时,我们更新无重复字符子串的最大长度,即 $ans = max(ans , i - j + 1)$ 。
48
48
49
- 最后返回 res 即可。
49
+ 遍历结束后,我们返回 $ans$ 即可。
50
+
51
+ 时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 是字符串 $s$ 的长度;而 $C$ 是字符集的大小。
50
52
51
53
<!-- tabs:start -->
52
54
55
57
``` python
56
58
class Solution :
57
59
def lengthOfLongestSubstring (self , s : str ) -> int :
58
- i = j = res = 0
59
- chars = set ()
60
- while i < len (s):
61
- while s[i] in chars:
62
- if s[j] in chars :
63
- chars.remove( s[j])
60
+ cnt = Counter()
61
+ ans = j = 0
62
+ for i, c in enumerate (s):
63
+ cnt[c] += 1
64
+ while cnt[c] > 1 :
65
+ cnt[ s[j]] -= 1
64
66
j += 1
65
- chars.add(s[i])
66
- res = max (res, i - j + 1 )
67
- i += 1
68
- return res
67
+ ans = max (ans, i - j + 1 )
68
+ return ans
69
+ ```
70
+
71
+ ``` python
72
+ class Solution :
73
+ def lengthOfLongestSubstring (self , s : str ) -> int :
74
+ vis = set ()
75
+ ans = j = 0
76
+ for i, c in enumerate (s):
77
+ while c in vis:
78
+ vis.remove(s[j])
79
+ j += 1
80
+ vis.add(c)
81
+ ans = max (ans, i - j + 1 )
82
+ return ans
69
83
```
70
84
71
85
### ** Java**
72
86
73
87
``` java
74
88
class Solution {
75
89
public int lengthOfLongestSubstring (String s ) {
76
- int res = 0 ;
77
- Set<Character > set = new HashSet<> ();
78
- for (int i = 0 , j = 0 ; i < s. length(); ++ i) {
79
- char c = s. charAt(i);
80
- while (set. contains(c)) {
81
- set. remove(s. charAt(j++ ));
90
+ int ans = 0 , j = 0 ;
91
+ Set<Character > vis = new HashSet<> ();
92
+ for (int i = 0 ; i < s. length(); ++ i) {
93
+ while (vis. contains(s. charAt(i))) {
94
+ vis. remove(s. charAt(j++ ));
82
95
}
83
- set . add(c );
84
- res = Math . max(res , i - j + 1 );
96
+ vis . add(s . charAt(i) );
97
+ ans = Math . max(ans , i - j + 1 );
85
98
}
86
- return res ;
99
+ return ans ;
87
100
}
88
101
}
89
102
```
@@ -94,35 +107,35 @@ class Solution {
94
107
class Solution {
95
108
public:
96
109
int lengthOfLongestSubstring(string s) {
97
- int res = 0;
98
- unordered_set<char > chars ;
110
+ int ans = 0;
111
+ unordered_set<char > vis ;
99
112
for (int i = 0, j = 0; i < s.size(); ++i) {
100
- while (chars .count(s[ i] )) {
101
- chars .erase(s[ j++] );
113
+ while (vis .count(s[ i] )) {
114
+ vis .erase(s[ j++] );
102
115
}
103
- chars .insert(s[ i] );
104
- res = max(res , i - j + 1);
116
+ vis .insert(s[ i] );
117
+ ans = max(ans , i - j + 1);
105
118
}
106
- return res ;
119
+ return ans ;
107
120
}
108
121
};
109
122
```
110
123
111
124
### **Go**
112
125
113
126
```go
114
- func lengthOfLongestSubstring(s string) int {
115
- chars := make( map[byte]bool)
116
- res := 0
117
- for i, j := 0, 0; i < len(s); i++ {
118
- for chars [s[i]] {
119
- chars [s[j]] = false
127
+ func lengthOfLongestSubstring(s string) (ans int) {
128
+ vis := map[byte]bool{}
129
+ j := 0
130
+ for i := range s {
131
+ for vis [s[i]] {
132
+ vis [s[j]] = false
120
133
j++
121
134
}
122
- chars [s[i]] = true
123
- res = max(res , i-j+1)
135
+ vis [s[i]] = true
136
+ ans = max(ans , i-j+1)
124
137
}
125
- return res
138
+ return
126
139
}
127
140
128
141
func max(a, b int) int {
@@ -141,53 +154,33 @@ func max(a, b int) int {
141
154
* @return {number}
142
155
*/
143
156
var lengthOfLongestSubstring = function (s ) {
144
- let res = 0 ;
145
- let chars = new Set ();
157
+ let ans = 0 ;
158
+ let vis = new Set ();
146
159
for (let i = 0 , j = 0 ; i < s .length ; ++ i) {
147
- while (chars .has (s[i])) {
148
- chars .delete (s[j++ ]);
160
+ while (vis .has (s[i])) {
161
+ vis .delete (s[j++ ]);
149
162
}
150
- chars .add (s[i]);
151
- res = Math .max (res , i - j + 1 );
163
+ vis .add (s[i]);
164
+ ans = Math .max (ans , i - j + 1 );
152
165
}
153
- return res ;
166
+ return ans ;
154
167
};
155
168
```
156
169
157
170
### ** TypeScript**
158
171
159
172
``` ts
160
173
function lengthOfLongestSubstring(s : string ): number {
161
- const n = s .length ;
162
- const set = new Set <string >();
163
- let res = 0 ;
164
- let i = 0 ;
165
- for (let j = 0 ; j < n ; j ++ ) {
166
- const c = s [j ];
167
- while (set .has (c )) {
168
- set .delete (s [i ++ ]);
169
- }
170
- set .add (c );
171
- res = Math .max (res , set .size );
172
- }
173
- return res ;
174
- }
175
- ```
176
-
177
- ``` ts
178
- function lengthOfLongestSubstring(s : string ): number {
179
- const map = new Map <string , number >();
180
- const n = s .length ;
181
- let res = 0 ;
182
- let i = - 1 ;
183
- for (let j = 0 ; j < n ; j ++ ) {
184
- if (map .has (s [j ])) {
185
- i = Math .max (i , map .get (s [j ]));
174
+ let ans = 0 ;
175
+ let vis = new Set <string >();
176
+ for (let i = 0 , j = 0 ; i < s .length ; ++ i ) {
177
+ while (vis .has (s [i ])) {
178
+ vis .delete (s [j ++ ]);
186
179
}
187
- map . set (s [j ], j );
188
- res = Math .max (res , j - i );
180
+ vis . add (s [i ] );
181
+ ans = Math .max (ans , i - j + 1 );
189
182
}
190
- return res ;
183
+ return ans ;
191
184
}
192
185
```
193
186
@@ -243,15 +236,14 @@ impl Solution {
243
236
``` cs
244
237
public class Solution {
245
238
public int LengthOfLongestSubstring (string s ) {
246
- var set = new HashSet <char >();
239
+ var vis = new HashSet <char >();
247
240
int ans = 0 ;
248
- for (int l = 0 , r = 0 ; r < s .Length ; r ++ ) {
249
- while (set .Contains (s [r ]))
250
- {
251
- set .Remove (s [l ++ ]);
241
+ for (int i = 0 , j = 0 ; i < s .Length ; ++ i ) {
242
+ while (vis .Contains (s [i ])) {
243
+ vis .Remove (s [j ++ ]);
252
244
}
253
- ans = Math . Max ( r - l + 1 , ans );
254
- set . Add ( s [ r ] );
245
+ vis . Add ( s [ i ] );
246
+ ans = Math . Max ( ans , i - j + 1 );
255
247
}
256
248
return ans ;
257
249
}
0 commit comments