📅  最后修改于: 2023-12-03 15:42:22.151000             🧑  作者: Mango
给定一个只包含小写字母的字符串 s
,你需要计算出最多连续出现多少个不同的字母。
例如,对于字符串 "abcabb"
,最多连续出现了 3
个不同的字母,分别为 a
、 b
和 c
。
s
(长度不超过 100000
)。输入:"abcabb"
输出:3
分析:最多出现的不同字母数为 3
,分别是 a
、 b
和 c
。
输入:"abccd"
输出:3
分析:最多出现的不同字母数为 3
,分别是 a
、 b
和 c
。
本题要求字符串中最多连续出现的不同字母数,我们可以遍历字符串并使用双指针维护一个滑动窗口。当窗口中没有重复字符时,不断扩大右边界;当窗口中有重复字符时,不断缩小左边界。过程中,用一个变量记录窗口中出现的不同字符数。
具体实现时,可以使用一个哈希集合记录当前窗口中的字符,通过 set 中字符数量是否等于窗口长度来判断窗口内是否有重复字符。
详细解题思路可参考代码注释。
class Solution:
def maxLength(self, s: str) -> int:
set_ = set() # 哈希集合,存放窗口内出现的字符
r = -1 # 右指针,初始值为 -1
n = len(s) # 字符串长度
max_len = 0 # 最大长度,初始值为 0
# 枚举左指针起点 i,右指针会向右移动,窗口会逐步扩大
for i in range(n):
if i != 0: # 左指针向右移动一个位置,也就是缩小窗口
set_.remove(s[i - 1])
# 不断移动右指针,直到出现重复字符,测量当前窗口长度
while r + 1 < n and s[r + 1] not in set_:
set_.add(s[r + 1])
r += 1
max_len = max(max_len, r - i + 1) # 记录最大长度
return max_len
本题通过滑动窗口的方法解决,时间复杂度为 $O(n)$。需要注意的是,使用哈希集合时,需要每次判断是否有重复字符,因此不能用哈希表。