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

70 阅读3分钟
  1. 理解问题:

    • 我找到一个由 0 和 1 组成的序列,其中 0 和 1 交替出现,并且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。
    • 如果有多个神奇数列,那么输出最先出现的一个。
  2. 数据结构选择:

    • 可以使用字符串来表示输入的序列。
    • 使用两个指针来遍历字符串,找到符合条件的子序列。
  3. 算法步骤:

    • 遍历字符串,检查每个可能的子序列是否符合「神奇数列」的条件。
    • 使用两个指针 start 和 end 来标记当前检查的子序列的起始和结束位置。
    • 如果找到符合条件的子序列,记录其长度和起始位置。
    • 继续遍历,直到找到最长的「神奇数列」
    • 一个「神奇数列」必须由 0 和 1 交替出现。例如,10101 是一个神奇数列,而 1011 不是。 - 「神奇数列」的长度至少为 3。
  4. 目标:

    • 在给定的字符串中,找到最长的「神奇数列」。
    • 如果有多个神奇数列,输出最先出现的一个。 数据结构选择

由于我们处理的是字符串,最自然的选择就是使用字符串数据结构。我们可以通过遍历字符串来检查每个可能的子序列是否符合「神奇数列」的条件。

算法步骤

  1. 遍历字符串:

    • 使用两个嵌套的循环来遍历所有可能的子序列。外层循环控制子序列的起始位置 start,内层循环控制子序列的结束位置 end
    • 为了确保子序列的长度至少为 3,内层循环的起始位置从 start + 3 开始。
  2. 检查子序列:

    • 编写一个辅助函数 is_magic_sequence 来检查子序列是否符合「神奇数列」的条件。
    • 在 is_magic_sequence 函数中,遍历子序列的每个字符,检查相邻字符是否相同。如果相同,则返回 False,表示该子序列不是「神奇数列」。
  3. 更新最长子序列:

    • 如果找到符合条件的子序列,并且其长度大于当前记录的最长子序列长度,则更新最长子序列的信息。
    • 记录最长子序列的起始位置和长度。
  4. 返回结果:

    • 根据记录的最长子序列的起始位置和长度,从原字符串中截取并返回最长的「神奇数列」。
def solution(inp):
    max_length = 0
    max_start = 0
    
    # 遍历字符串,检查每个可能的子序列
    for start in range(len(inp)):
        for end in range(start + 3, len(inp) + 1):
            subseq = inp[start:end]
            # 检查子序列是否符合「神奇数列」的条件
            if is_magic_sequence(subseq):
                # 如果当前子序列更长,更新最长子序列的信息
                if len(subseq) > max_length:
                    max_length = len(subseq)
                    max_start = start
    
    # 返回最长的「神奇数列」
    return inp[max_start:max_start + max_length]

def is_magic_sequence(subseq):
    # 检查子序列是否由交替的 `0``1` 组成
    for i in range(1, len(subseq)):
        if subseq[i] == subseq[i - 1]:
            return False
    return True

if __name__ == "__main__":
    # Add your test cases here
    print(solution("0101011101") == "010101")