📌  相关文章
📜  不包含给定字符串的任何字符的字符串计数(1)

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

不包含给定字符串的任何字符的字符串计数

如果给定一个字符串s和一个字符串t,统计s中有多少个子串不包含字符串t中的任何字符。

思路

类似于滑动窗口的思想,我们可以从字符串s的开头开始遍历,判断当前字符是否在字符串t中出现,如果没有出现,将右侧指针向右移动,计算子串数量,否则将左侧指针向右移动,并且不计算子串数量,直到不包含t中任何字符为止。

代码实现
def count_substrings(s: str, t: str) -> int:
    n, m = len(s), len(t)
    l, r = 0, 0
    res = 0
    while l < n:
        if s[l] not in t:
            r = l + 1
            while r < n and all([c not in t for c in s[l:r+1]]):
                r += 1
            res += (r - l) * (r - l + 1) // 2
            l = r
        else:
            l += 1
    return res
复杂度分析
  • 时间复杂度:$O(n^2)$,其中n是字符串s的长度。需要枚举所有的子串,每个子串最多需要遍历t中的所有字符来判断是否包含t中的任意字符。
  • 空间复杂度:$O(1)$,只使用了常数级别的额外空间。
测试样例
>>> count_substrings('abc', 'def')
6
>>> count_substrings('aabbaaa', 'ba')
9
>>> count_substrings('abc', 'x')
0