📌  相关文章
📜  具有所有不同字符的子字符串的计数(1)

📅  最后修改于: 2023-12-03 14:50:07.202000             🧑  作者: Mango

计数具有所有不同字符的子字符串
问题描述

给定一个字符串 S,计算具有所有不同字符的子字符串的数量。

例子

输入:S = "abcabc"

输出:10

解释:具有所有不同字符的子字符串为 "a", "b", "c", "ab", "ac", "bc", "abc", "bca", "cab" 和 "cba"。共有 10 个。

解决方法

这是一个典型的滑动窗口问题。我们维护一个滑动窗口,通过移动右边界来扩展窗口,并移动左边界来缩小窗口。当子字符串包含了所有不同的字符时,我们增加计数器并缩小左边界。

def countSubstring(s: str) -> int:
    ans, left, right = 0, 0, 0
    dictChar = {}
    while right < len(s):
        dictChar[s[right]] = dictChar.get(s[right], 0) + 1
        while left <= right and len(dictChar) != right - left + 1:
            dictChar[s[left]] -= 1
            if dictChar[s[left]] == 0:
                dictChar.pop(s[left])
            left += 1
        ans += right - left + 1
        right += 1
    return ans
复杂度分析
  • 时间复杂度:$O(n)$,其中 n 是字符串 S 的长度。
  • 空间复杂度:$O(m)$,其中 m 是字符集的大小。在最坏情况下,我们需要存储字符集中的所有字符。