📜  门| GATE CS 2021 |设置 2 |第 55 题(1)

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

门 | GATE CS 2021 |设置 2 |第 55 题

这是一道来自 GATE CS 2021 设置 2 的编程题,题号为第 55 题。此题需要使用 Python 编写程序,要求输入一个整数 N,输出由 0 和 1 组成的长度为 N 的所有字符串中,以 01 或 10 为子串的字符串个数。

题目详情

输入:

  • N:一个整数(2 ≤ N ≤ $10^9$)

输出:

  • count:满足要求的字符串个数

输出格式一个整数,表示符合要求的字符串数量。

例如,当 N = 3 时,位数为 3 的所有字符串如下所示:

000
001
010
011
100
101
110
111

其中符合要求的字符串为 010、101,共 2 个。

解题思路

首先,我们需要查询 01 和 10 的出现位置,然后计算它们的组合数量即可。但是,计算组合数量是非常耗费时间的,因此我们需要寻找某种类似规律的东西。

我们可以先从短字符串入手,通过手工计算找到如下的规律:

  • 当 N = 2 时,有 2 个。
  • 当 N = 3 时,有 2 个。
  • 当 N = 4 时,有 4 个。
  • 当 N = 5 时,有 6 个。
  • 当 N = 6 时,有 10 个。
  • 当 N = 7 时,有 16 个。
  • 当 N = 8 时,有 26 个。

在这个规律中,我们可以看到一个斐波那契数列的样子。我们可以用数列生成函数来求出数列的值,然后使用递推方式即可计算出答案。

代码实现

以下是用 Python 代码实现上述思路的代码片段,返回 markdown 格式。

def fibonacci(n):
    if n == 0: return 0
    if n == 1: return 2
    return fibonacci(n - 1) + fibonacci(n - 2)

def count_strs(n):
    return fibonacci(n)

print(count_strs(3)) # 应输出 2