LeetCode 159. 至多包含两个不同字符的最长子串

题目描述

🔥 159. 至多包含两个不同字符的最长子串

给定一个字符串 s ,找出至多包含两个不同字符的最长子串的长度。


示例 1: 输入:s = "eceba" 输出:3 解释:"ece" 是符合题意的最长子串。

示例 2: 输入:s = "ccaabbb" 输出:5 解释:"aabbb" 是符合题意的最长子串。

思路分析

我们可以使用滑动窗口的技巧来解决这个问题。具体思路如下:

  1. 使用两个指针 leftright 来表示当前窗口的范围。
  2. 使用一个哈希表来记录窗口内字符的频率。
  3. 当窗口内的不同字符超过两个时,移动 left 指针,直到窗口内的不同字符数量不超过两个。
  4. 在每次移动 right 指针时,更新最长子串的长度。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func lengthOfLongestSubstringTwoDistinct(s string) int {
	left, right := 0, 0
	charCount := make(map[byte]int)
	maxLength := 0

	for right < len(s) {
		// 将当前字符加入窗口
		charCount[s[right]]++

		// 如果窗口内的不同字符超过两个,移动左指针
		for len(charCount) > 2 {
			charCount[s[left]]--
			if charCount[s[left]] == 0 {
				delete(charCount, s[left])
			}
			left++
		}

		// 更新最长子串的长度
		maxLength = max(maxLength, right-left+1)
		right++
	}

	return maxLength
}

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/88184672
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!