📌  相关文章
📜  没有长度≥ 3 的子串的二进制字符串数(1)

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

没有长度≥3的子串的二进制字符串数

给定一个二进制串,求其中没有长度≥3的子串的个数。

解题思路

设 $dp[i]$ 表示长度为 $i$ 且没有长度≥3的子串的数目。

我们考虑如何计算 $dp[i]$。

  • 如果加上一个 0,那么我们需要在串末尾加上一个 10,那么 $dp[i]=dp[i-2]$。
  • 如果加上一个 1,同样的我们需要在串末尾加上一个 01,那么 $dp[i]=dp[i-2]$。

综上,$dp[i]=dp[i-2]+dp[i-2]=2 \times dp[i-2]$。

同时,对于 $i<2$,我们有 $dp[i]=2^i$,因为长度小于 2 的串不会有长度≥3的子串。

因此,我们可以用动态规划来计算答案,时间复杂度 $O(n)$。

代码实现
def num_of_binary_strings(n):
    dp = [0] * (n + 1)
    dp[0] = 1
    dp[1] = 2
    for i in range(2, n + 1):
        dp[i] = 2 * dp[i - 2]
    return dp[n]
总结

本题考察了动态规划中的状态设计和状态转移方程。

在状态设计上,我们需要思考如何设计状态才能描述问题的解。

在状态转移方程上,我们需要思考如何从已知状态推导出新的状态,同时确保状态转移的正确性。