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

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

不包含给定字符的子字符串的计数

在字符串处理中,我们经常需要统计一个字符串中不包含给定字符的子字符串的数量。这个问题可以用动态规划来解决,时间复杂度为 O(n^2)。

思路

假设给定的字符串为 s,需要统计不包含给定字符 c 的子字符串数量。我们可以用 dp[i] 表示以第 i 个字符结尾的不包含 c 的子字符串数量。对于 dp[i],有以下两种情况:

  1. 如果 s[i] 不等于 c,则 dp[i] 包含以第 i-1 个字符结尾的所有不包含 c 的子字符串,以及 s[i] 单独组成的不包含 c 的子字符串。因此有:dp[i] = dp[i-1] + 1

  2. 如果 s[i] 等于 c,则 dp[i] 只包含以第 i-1 个字符结尾的不包含 c 的子字符串。因此有:dp[i] = dp[i-1]

最终的结果即为 dp 数组的和。

代码

以下是 Python 代码实现:

def count_substrings(s: str, c: str) -> int:
    n = len(s)
    dp = [0] * n
    res = 0
    for i in range(n):
        if s[i] != c:
            dp[i] = dp[i-1] + 1 if i > 0 else 1
        if i > 0:
            res += dp[i-1]
    return res + dp[n-1]
例子

假设字符串为 aabaa,给定字符为 a,则不包含 a 的子字符串为 {b, b, bb},数量为 3。

>>> count_substrings('aabaa', 'a')
3
时间复杂度

算法的时间复杂度为 O(n),其中 n 是字符串的长度。