📅  最后修改于: 2023-12-03 15:06:29.008000             🧑  作者: Mango
这个问题可以使用动态规划解决。我们可以定义 $dp[i][j]$ 为第 $i$ 位数字是 $j$($j=0$ 或 $j=1$)时,总和为 $i$ 的数字串的个数。
对于当前位置 $i$,我们可以选择填入0或者1,因此转移方程如下:
$dp[i][0] = dp[i-1][1]$
$dp[i][1] = dp[i-1][0] + dp[i-1][1]$
初始状态为 $dp[1][0]=dp[1][1]=1$。
最终答案即为 $dp[n][0]+dp[n][1]$。
以下是 Python 代码实现:
def count_bin_strings(n: int) -> int:
dp = [[0] * 2 for _ in range(n+1)]
dp[1][0], dp[1][1] = 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]
return dp[n][0] + dp[n][1]
该算法的时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。