3.无重复字符的最长子串
luffy 4/13/2023 力扣
# 3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1
2
3
2
3
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
1
2
3
2
3
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
1
2
3
4
2
3
4
解题思路:
1、用双指针维护一个滑动窗口,用来剪切子串。
2、不断移动右指针,直到遇到重复字符的时候把左指针移到前面的重复字符的下一位。(相当于把前面的重复字符删除)
3、移动指针过程中,记录窗口长度的最大值即为答案。
java
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0) return 0 ;
int max=0;
int left = 0;
HashMap<Character,Integer> map = new HashMap<>();
for(int i =0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
max = Math.max(max,i-left+1);
}
return max;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
JavaScript
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (s.length === 0) return 0;
let left = 0;
let res = 0;
let map = new Map();
for (i = 0; i < s.length; i++) {
if (map.has(s[i]) && map.get(s[i]) >= left) {
left = Math.max(left, map.get(s[i]) + 1);
}
map.set(s[i], i);
res = Math.max(res, i - left + 1);
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TypeScript
function lengthOfLongestSubstring(s: string): number {
if (s.length === 0) return 0;
let left: number = 0;
let res: number = 0
let map = new Map<string, number>();
let i: number = 0
for (i = 0; i < s.length; i++) {
if(map.has(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i))+1)
}
map.set(s.charAt(i),i);
res = Math.max(res,i-left+1);
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18