找出最长的神奇数列 | 豆包MarsCode AI刷题

69 阅读3分钟

问题描述

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

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

问题分析

我们给定一个由 01 组成的字符串 inp,目标是找到其中最长的「神奇数列」。所谓「神奇数列」,就是:

  • 该子序列由 01 交替构成。
  • 且该子序列的长度至少为 3。

我们需要输出最长的「神奇数列」,如果存在多个相同长度的子序列,则输出最先出现的一个。

示例

示例 1

输入:

inp = "0101011101"

输出:

'010101'

示例 2

输入:

inp = "1110101010000"

输出:

'10101010'

思路

这个问题的核心在于遍历字符串并寻找最长的交替子序列。

  1. 遍历字符串:我们逐个字符检查字符串中的字符是否与前一个字符交替。
  2. 构建当前神奇数列:如果当前字符与前一个字符交替(即不相等),我们就将其加入当前的「神奇数列」。
  3. 结束当前神奇数列:如果当前字符与前一个字符相等(即没有交替),我们需要检查当前构建的神奇数列是否满足长度要求(至少为 3),如果满足,就更新最长的神奇数列。
  4. 返回结果:遍历结束后,再检查一次当前构建的神奇数列,确保最后的神奇数列是最长的。

代码实现

下面是基于以上思路的 Python 代码实现:

def solution(inp):
    max_magic = ""
    current_magic = inp[0]

    for i in range(1, len(inp)):
        if inp[i] != inp[i - 1]:
            current_magic += inp[i]
        else:
            if len(current_magic) >= 3:
                max_magic = current_magic if len(current_magic) > len(max_magic) else max_magic
            current_magic = inp[i]
    
    if len(current_magic) >= 3:
        max_magic = current_magic if len(current_magic) > len(max_magic) else max_magic
    
    return max_magic

# 测试用例
if __name__ == "__main__":
    print(solution("0101011101") == "010101")
    print(solution("10101") == "10101")
    print(solution("11100") == "")
    print(solution("010") == "010")
    print(solution("1") == "")

代码解读

  1. 初始化

    • max_magic 用来存储最长的「神奇数列」。
    • current_magic 用来存储当前正在构建的「神奇数列」。
  2. 遍历字符串

    • 从字符串的第二个字符开始(索引 1),逐个检查当前字符与前一个字符是否交替。
    • 如果交替(即当前字符与前一个字符不同),我们将当前字符添加到 current_magic 中,继续构建当前的神奇数列。
    • 如果没有交替,检查当前神奇数列的长度是否满足条件(长度至少为 3),并更新 max_magic
  3. 检查

    • 遍历结束后,我们还需要检查最后一个构建的神奇数列是否是最长的,如果满足条件(长度至少为 3),就更新 max_magic
  4. 返回结果

    • 最后返回最长的神奇数列。如果没有满足条件的子序列,则返回空字符串。

时间复杂度分析

  • 时间复杂度O(n),其中 n 是字符串 inp 的长度。我们只需要遍历字符串一次。
  • 空间复杂度O(n),主要用来存储 max_magiccurrent_magic