📜  门|门 IT 2008 |第 55 题(1)

📅  最后修改于: 2023-12-03 15:42:22.151000             🧑  作者: Mango

题目介绍:“门|门 IT 2008” 第55题

题目描述

给定一个只包含小写字母的字符串 s ,你需要计算出最多连续出现多少个不同的字母。

例如,对于字符串 "abcabb" ,最多连续出现了 3 个不同的字母,分别为 abc

输入格式
  • 输入一个只包含小写字母的字符串 s(长度不超过 100000)。
输出格式
  • 输出一个整数,表示最多连续出现的不同字母数。
示例1
  • 输入:"abcabb"

  • 输出:3

  • 分析:最多出现的不同字母数为 3 ,分别是 abc

示例2
  • 输入:"abccd"

  • 输出:3

  • 分析:最多出现的不同字母数为 3 ,分别是 abc

解题思路

本题要求字符串中最多连续出现的不同字母数,我们可以遍历字符串并使用双指针维护一个滑动窗口。当窗口中没有重复字符时,不断扩大右边界;当窗口中有重复字符时,不断缩小左边界。过程中,用一个变量记录窗口中出现的不同字符数。

具体实现时,可以使用一个哈希集合记录当前窗口中的字符,通过 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)$。需要注意的是,使用哈希集合时,需要每次判断是否有重复字符,因此不能用哈希表。