📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 32(1)

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

国际空间研究组织 | ISRO CS 2020 |问题 32

题目描述

给定一个正整数N,你需要找到所有由数字1,2和3组成的长度为N的字符串,使得1不是相邻的数字。这里,两个连续的数字可以是相同的。

输入格式
  • 单个正整数N表示字符串长度
输出格式
  • 每行输出一个由1、2、3组成的字符串,满足上述条件
数据范围
  • 1<=N<=10
示例
输入示例1
3
输出示例1
121
123
131
132
212
213
231
232
312
313
321
323

解题思路

首先可以很快的想到用递归的方式来解决这个问题,同时,我们需要发现,在当前已经形成的字符串中,如果该字符串的最后一位是字符"1",那么下一个字符只能是字符"2"和字符"3"。如果该字符串的最后一位是字符"2"或者字符"3",那么下一个字符可以是字符"1"、"2"或者"3"。依次递归下去即可。

算法代码

def dfs(n, s):
    if len(s) == n:
        print(s)
        return
    if s == "" or s[-1] == "2" or s[-1] == "3":
        dfs(n, s + "1")
    dfs(n, s + "2")
    dfs(n, s + "3")

n = int(input())
dfs(n, "")

算法复杂度分析

时间复杂度
  • 对于长度n的字符串,每一位可以填1、2、3这三个字符,所以总共的时间复杂度是O(3^n)。
空间复杂度
  • 递归层数最多达到了n+1层,所以空间复杂度也是O(n)级别的。