青训营X豆包MarsCode 技术训练营:找出最长的神奇数列Python3题解 | 豆包MarsCode AI 刷题

70 阅读4分钟

问题描述

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?

如果有多个神奇数列,那么输出最先出现的一个。


测试样例

样例1:

输入:inp = "0101011101"
输出:'010101'

样例2:

输入:inp = "1110101010000"
输出:'10101010'

样例3:

输入:inp = "1010101010101010"
输出:'1010101010101010'

解题思路

首先,我们需要理解「神奇数列」的定义:它是一个由 01 交替组成的序列,且至少由 3 个连续的 01 组成。

  1. 遍历输入字符串:我们需要遍历整个输入字符串,检查每个可能的子序列是否符合「神奇数列」的定义。
  2. 检查子序列:对于每个子序列,我们需要检查它是否由 01 交替组成,并且长度至少为 3。
  3. 记录最长的神奇数列:在遍历过程中,如果发现更长的神奇数列,就更新记录。

代码提示

我们可以通过以下步骤来实现这个逻辑:

  1. 初始化变量:我们需要一个变量来记录当前找到的最长神奇数列。
  2. 遍历字符串:使用两个嵌套的循环来遍历所有可能的子序列。
  3. 检查子序列:对于每个子序列,检查它是否符合神奇数列的定义。
  4. 更新最长神奇数列:如果找到更长的神奇数列,更新记录。

Python3代码(通过豆包Marscode测试)

def solution(inp):
    max_magic_sequence = ""
    
    # 遍历所有可能的子序列
    for i in range(len(inp)):
        for j in range(i + 3, len(inp) + 1):
            subseq = inp[i:j]
            
            # 检查子序列是否为神奇数列
            if is_magic_sequence(subseq):
                # 如果当前子序列比已记录的最长神奇数列更长,更新记录
                if len(subseq) > len(max_magic_sequence):
                    max_magic_sequence = subseq
    
    return max_magic_sequence

# 辅助函数:检查子序列是否为神奇数列
def is_magic_sequence(subseq):
    # 检查子序列是否由0和1交替组成
    for k in range(1, len(subseq)):
        if subseq[k] == subseq[k - 1]:
            return False
    return True

if __name__ == "__main__":
    print(solution("0101011101") == "010101")

关键步骤

  • 遍历所有可能的子序列:使用两个嵌套的循环来遍历所有可能的子序列。
  • 检查子序列是否为神奇数列:编写一个辅助函数 is_magic_sequence 来检查子序列是否由 01 交替组成。
  • 更新最长神奇数列:在遍历过程中,如果找到更长的神奇数列,更新记录。

时间复杂度

  • 外层循环:遍历字符串的所有可能的起始位置,时间复杂度为 O(n),其中 n 是字符串的长度。
  • 内层循环:对于每个起始位置,遍历所有可能的结束位置,时间复杂度为 O(n)
  • 检查子序列:对于每个子序列,检查它是否为神奇数列,时间复杂度为 O(m),其中 m 是子序列的长度。

综合起来,总的时间复杂度为 O(n^3),因为在最坏情况下,每个子序列都需要检查。

空间复杂度

  • 存储子序列:在检查子序列时,需要存储当前的子序列,空间复杂度为 O(m),其中 m 是子序列的长度。
  • 存储最长神奇数列:需要存储当前找到的最长神奇数列,空间复杂度为 O(n)

综合起来,总的空间复杂度为 O(n)