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

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

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

问题描述

给定一个整数n,请找出长度为n的01字符串中有多少个字符串的前半部分具有两次连续的0?

解决方案
思路

我们可以使用动态规划来解决这个问题。用dp[i][0]表示前i个字符以'00'结尾的计数,用dp[i][1]表示前i个字符以'0'结尾但不以'00'结尾的计数,用dp[i][2]表示前i个字符不以'0'结尾的计数。

对于dp[i][0],它只能由以'10'结尾的dp[i-1][1]转移过来,即dp[i][0] = dp[i-1][1]。

对于dp[i][1],它可以由以'1'结尾的dp[i-1][0]和dp[i-1][1]转移来,即dp[i][1] = dp[i-1][0] + dp[i-1][1]。

对于dp[i][2],它可以由以'0'结尾的dp[i-1][1]和dp[i-1][2]转移来,以及以'1'结尾的dp[i-1][1]和dp[i-1][2]转移来,即dp[i][2] = dp[i-1][1] + dp[i-1][2]。

最后的答案就是dp[n][0] + dp[n][1] + dp[n][2]。

代码
def countBinarySubstrings(n: int) -> int:
    dp = [[0] * 3 for _ in range(n + 1)]
    dp[1][0], dp[1][1], dp[1][2] = 0, 1, 1 # 初始化
    for i in range(2, n + 1):
        dp[i][0] = dp[i-1][1]
        dp[i][1] = dp[i-1][0] + dp[i-1][1]
        dp[i][2] = dp[i-1][1] + dp[i-1][2]
    return dp[n][0] + dp[n][1] + dp[n][2]
复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)