LeetCode 340. 至多包含 K 个不同字符的最长子串
题目描述
给定一个字符串
s
和一个整数k
,找出至多包含k
个不同字符的最长子串的长度。
示例 1: 输入:
s = "eceba", k = 2
输出:3
解释:"ece"
是符合题意的最长子串。示例 2: 输入:
s = "aa", k = 1
输出:2
解释:"aa"
是符合题意的最长子串。
思路分析
我们可以使用滑动窗口的技巧来解决这个问题。具体思路如下:
- 使用两个指针
left
和right
来表示当前窗口的范围。- 使用一个哈希表来记录窗口内字符的频率。
- 当窗口内的不同字符数量超过
k
时,移动left
指针,直到窗口内的不同字符数量不超过k
。- 在每次移动
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 lengthOfLongestSubstringKDistinct(s string, k int) int {
left, right := 0, 0
charCount := make(map[byte]int)
maxLength := 0
for right < len(s) {
// 将当前字符加入窗口
charCount[s[right]]++
// 如果窗口内的不同字符超过 k,移动左指针
for len(charCount) > k {
charCount[s[left]]--
if charCount[s[left]] == 0 {
delete(charCount, s[left])
}
left++
}
// 更新最长子串的长度
maxLength = max(maxLength, right-left+1)
right++
}
return maxLength
}
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用