📌  相关文章
📜  计算没有连续 1 的二进制字符串的数量:设置 2(1)

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

计算没有连续 1 的二进制字符串的数量:设置 2

简介

在二进制字符串中,如果没有连续的 1,那么这个字符串就被称为有效的。本文讨论如何计算长度为 n 的有效二进制字符串的数量,其中连续的 1 的数量不超过 2。

这是一个经典的数学问题,可以用递推的方法解决。我们可以使用两个变量来记录有效二进制字符串的数量,假设当前已经填好了 n 个字符:

  • last_zero:表示以一个 0 结尾的有效字符串的数量;
  • last_one:表示以一个 1 结尾,并且倒数第二个字符也是 1 的有效字符串的数量。

我们可以用下面的递推式来更新这两个变量:

  • last_zero_new = last_zero + last_one:如果在一个以 0 结尾的字符串后添加一个 0,那么整个字符串仍然是有效的。同时,如果在一个以 1 结尾并且倒数第二个字符是 0 的字符串后添加一个 0,那么也可以得到一个新的有效字符串;
  • last_one_new = last_zero:如果在一个以 0 结尾的字符串后添加一个 1,那么整个字符串仍然是有效的。同时,如果在一个以 1 结尾并且倒数第二个字符是 0 的字符串后添加一个 1,那么也可以得到一个新的有效字符串。

初始时,我们将 last_zero 和 last_one 都设置为 1,因为长度为 1 的字符串只有一个字符,并且连续的 1 的数量不超过 2。

最终的结果是 last_zero + last_one,因为有效字符串一定以 0 或 10 结尾,它们分别对应着 last_zero 和 last_one。

代码实现

下面是 Python 代码实现:

def count_valid_strings(n: int) -> int:
    last_zero, last_one = 1, 1
    for i in range(2, n + 1):
        last_zero_new = last_zero + last_one
        last_one_new = last_zero
        last_zero, last_one = last_zero_new, last_one_new
    return last_zero + last_one
性能分析

时间复杂度:$O(n)$,因为我们需要计算长度为 $1, 2, \cdots, n$ 的有效字符串的数量。

空间复杂度:$O(1)$,因为我们只需要记录两个变量。