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

题目描述

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

image-20230306130630185

思路分析

我们可以使用滑动窗口的方法来解决这个问题。具体步骤如下:

  1. 定义两个指针leftright,分别表示当前窗口的左右边界。
  2. 使用一个哈希集合:用于存储当前窗口中的字符,以便快速判断字符是否重复。
  3. 移动右指针:不断扩展窗口,直到遇到重复字符。
  4. 移动左指针:当遇到重复字符时,收缩窗口,直到窗口中不再有重复字符。
  5. 更新结果:每次更新窗口时,计算当前窗口的长度,并更新最大长度。

参考代码

特例:i = max(i, hashtable.get(c) + 1)

输入: “abba”

输出: 2

解释: 因为无重复字符的最长子串是 “ab / ba”,所以其长度为 2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func lengthOfLongestSubstring(s string) int {
	charSet := make(map[byte]bool)
	left, maxLength := 0, 0

	for right := 0; right < len(s); right++ {
		// 如果字符重复,收缩窗口
		for charSet[s[right]] {
			delete(charSet, s[left])
			left++
		}
		charSet[s[right]] = true
		maxLength = max(maxLength, right-left+1)
	}

	return maxLength
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func lengthOfLongestSubstring(s string) int {
	hashmap := make(map[byte]int)
	res := 0
	left, right := 0, 0
	for right < len(s) {
		c := s[right]
		if index, ok := hashmap[c]; ok {
			left = max(left, index+1)
		}
		res = max(res, right-left+1)
		hashmap[c] = right
		right++
	}
	return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func lengthOfLongestSubstring(s string) int {
	left, right, n := 0, 0, len(s)
	visited := make(map[byte]bool)
	res := 0
	for right < n {
		c := s[right]
		for visited[c] {
			delete(visited, s[left])
			left++
		}
		visited[c] = true
		right++
		if right-left > res {
			res = right - left
		}
	}
	return res
}

🍏 点击查看 Java 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> map = new HashMap<>();
        int i = 0;
        int res = 0;
        for (int j = 0; j < s.length(); j++) {
            char c = s.charAt(j);
            if (map.containsKey(c)) {
                i = Math.max(i, map.get(c) + 1);
            }
            res = Math.max(res, j - i + 1);
            map.put(c, j);
        }
        return res;
    }
}
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/11034463
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!