📌  相关文章
📜  计算由“ 11”组成的N长度二进制字符串作为子字符串(1)

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

计算由“ 11”组成的N长度二进制字符串作为子字符串

二进制字符串由0和1组成,我们希望计算出长度为N的二进制字符串中,由“11”组成的子字符串的个数。本文将介绍一种简单有效的算法。

算法思路

我们先来看一下示例输入:N=5。我们可以先列出所有可能的长度为5的二进制字符串:

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

我们可以发现,在前者插入一个“1”后,新生成的字符串从开头到第二个“1”一定是一个合法的由“11”组成的子字符串。比如在“00011”的前面插入一个“1”,生成的字符串“100011”中,“00011”是一个合法的子字符串。同时,新生成的字符串中,“1”后面的所有字符也可以构成合法的由“11”组成的子字符串。因此,我们可以沿用已经生成的以“11”结尾的字符串,将它们的末尾加上“0”和“1”,得到新的以“11”结尾的字符串。

具体而言,我们可以使用一个变量变量count11来记录以“11”结尾的字符串的个数。

count11 = 1  # 初始化长度为2的字符串“11”
for i in range(2, N+1):
    count11, pre_count11 = count11 + pre_count11, count11

其中,pre_count11记录的是上一步计算的以“11”结尾的字符串的个数。注意,这里是从i=2开始,因为长度为1的字符串没有以“11”结尾的。

完整代码实现
def count_binary_string(N):
    count11 = 1  # 初始化长度为2的字符串“11”
    pre_count11 = 0  # 初始化长度为1的字符串没有以“11”结尾的
    for i in range(2, N+1):
        count11, pre_count11 = count11 + pre_count11, count11
    return count11

测试样例与输出
assert count_binary_string(1) == 0
assert count_binary_string(2) == 1
assert count_binary_string(3) == 1
assert count_binary_string(4) == 2
assert count_binary_string(5) == 3
assert count_binary_string(6) == 5

以上是介绍计算由“ 11”组成的N长度二进制字符串作为子字符串的算法,希望对大家有所帮助。