📌  相关文章
📜  计数二进制字符串,其前半部分具有两次零(1)

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

计数二进制字符串,其前半部分具有两次零

在这个问题中,我们需要计算长度为 $n$ 的二进制字符串中,前半部分有两个连续的 $0$ 的字符串数量。例如,当 $n=5$ 时,合法字符串为 0011000111,总共有 2 种可能。

解题思路

我们可以通过观察可知,满足条件的字符串可以分为两类:

  1. 10 开头的字符串。可以发现,这种类型的字符串可以在后面随意添加 $n - 2$ 位,得到合法的长度为 $n$ 的字符串。因此这种类型的字符串的数量为 $2^{n-2}$。

  2. 11 开头的字符串。这种类型的字符串后面必定为 00,所以只需要在中间添加 $n - 4$ 位即可。因此这种类型的字符串的数量为 $2^{n-4}$。

因此,我们可以根据上述两种情况的数量来计算答案。最后的答案即为两种情况的数量之和。

代码实现
class Solution:
    def countBinarySubstrings(self, n: int) -> int:
        if n < 2:
            return 0
        count, prev_count = 0, 0
        for i in range(2, n + 1):
            if i == 2:
                count = 1
            elif i == 3:
                count = 2
            else:
                count = prev_count + 2 ** (i - 4) if i % 2 == 0 else prev_count
            prev_count = count
        return count
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 为需要计算的字符串长度。
  • 空间复杂度:$O(1)$,只使用了常数个变量。