LeetCode 题解工作台

长度为三且各字符不同的子字符串

如果一个字符串不含有任何重复字符,我们称这个字符串为 好 字符串。 给你一个字符串 s ,请你返回 s 中长度为 3 的 好子字符串 的数量。 注意,如果相同的好子字符串出现多次,每一次都应该被记入答案之中。 子字符串 是一个字符串中连续的字符序列。 示例 1: 输入: s = "xyzzaz" 输…

category

4

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

简单 · 滑动窗口(状态滚动更新)

bolt

答案摘要

我们可以维护一个滑动窗口,使得窗口内的字符不重复。初始时,我们用一个长度为 的二进制整数 表示窗口内的字符,其中第 位为 表示字符 在窗口内出现过,否则表示字符 在窗口内没有出现过。 然后,我们遍历字符串 ,对于每一个位置 ,如果 在窗口内出现过,我们需要将窗口的左边界 右移,直到窗口内不再有重复的字符。在这之后,我们将 加入窗口内,此时如果窗口的长度大于等于 ,那么我们就找到了…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 滑动窗口(状态滚动更新) 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

如果一个字符串不含有任何重复字符,我们称这个字符串为  字符串。

给你一个字符串 s ,请你返回 s 中长度为 3 的 好子字符串 的数量。

注意,如果相同的好子字符串出现多次,每一次都应该被记入答案之中。

子字符串 是一个字符串中连续的字符序列。

 

示例 1:

输入:s = "xyzzaz"
输出:1
解释:总共有 4 个长度为 3 的子字符串:"xyz","yzz","zza" 和 "zaz" 。
唯一的长度为 3 的好子字符串是 "xyz" 。

示例 2:

输入:s = "aababcabc"
输出:4
解释:总共有 7 个长度为 3 的子字符串:"aab","aba","bab","abc","bca","cab" 和 "abc" 。
好子字符串包括 "abc","bca","cab" 和 "abc" 。

 

提示:

  • 1 <= s.length <= 100
  • s​​​​​​ 只包含小写英文字母。
lightbulb

解题思路

方法一:滑动窗口

我们可以维护一个滑动窗口,使得窗口内的字符不重复。初始时,我们用一个长度为 2626 的二进制整数 mask\textit{mask} 表示窗口内的字符,其中第 ii 位为 11 表示字符 ii 在窗口内出现过,否则表示字符 ii 在窗口内没有出现过。

然后,我们遍历字符串 ss,对于每一个位置 rr,如果 s[r]\textit{s}[r] 在窗口内出现过,我们需要将窗口的左边界 ll 右移,直到窗口内不再有重复的字符。在这之后,我们将 s[r]\textit{s}[r] 加入窗口内,此时如果窗口的长度大于等于 33,那么我们就找到了一个以 s[r]\textit{s}[r] 结尾的长度为 33 的好子字符串。

遍历结束后,我们就找到了所有的好子字符串的数量。

时间复杂度 O(n)O(n),其中 nn 为字符串 ss 的长度。空间复杂度 O(1)O(1)

该解法可以拓展到长度为 kk 的好子字符串的数量。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def countGoodSubstrings(self, s: str) -> int:
        ans = mask = l = 0
        for r, x in enumerate(map(lambda c: ord(c) - 97, s)):
            while mask >> x & 1:
                y = ord(s[l]) - 97
                mask ^= 1 << y
                l += 1
            mask |= 1 << x
            ans += int(r - l + 1 >= 3)
        return ans
speed

复杂度分析

指标
时间complexity is O(n) since each character is visited once in the sliding window. Space complexity is O(1) because the set or hash table only tracks at most three characters at a time.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Emphasis on sliding window to check all substrings of fixed size.

  • question_mark

    Looking for use of a set or hash table to quickly detect distinct characters.

  • question_mark

    Expect attention to counting every occurrence of a good substring without missing duplicates.

warning

常见陷阱

外企场景
  • error

    Counting only unique substrings instead of all occurrences.

  • error

    Forgetting to reset or update the set/hash table correctly when sliding the window.

  • error

    Comparing characters incorrectly and miscounting substrings with repeated letters.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Count substrings of length k with distinct characters for any k > 1.

  • arrow_right_alt

    Return all good substrings instead of just counting them.

  • arrow_right_alt

    Check for substrings of size three that have exactly two distinct characters.

help

常见问题

外企场景

长度为三且各字符不同的子字符串题解:滑动窗口(状态滚动更新) | LeetCode #1876 简单