3.无重复字符的最长子串

4/13/2023 力扣

# 3.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1
2
3

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
1
2
3

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
1
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

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

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
Last Updated: 4/13/2023, 10:41:52 AM