找出最长的神奇数列详解

228 阅读3分钟

问题描述

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

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

  • 整体思路

    • 代码通过遍历输入的由 0 和 1 组成的字符串序列,不断构建和检查可能的 “神奇数列”,并记录下最长的那个。
  • 变量定义

    • max_magic:用于存储到目前为止找到的最长的 “神奇数列”,初始化为空字符串。
    • current_magic:用来存储当前正在构建的 “神奇数列”,初始化为输入序列的第一个字符(因为构建神奇数列是从第一个字符开始逐步添加的)。
  • 遍历过程

    • 使用for循环从字符串的第二个字符开始遍历(索引为 1),一直到字符串的末尾(索引为len(inp) - 1)。
    • 情况一:字符交替时:当inp[i]!= inp[i - 1],即当前字符和前一个字符交替(不相等),说明当前正在构建的 “神奇数列” 可以继续添加当前字符,所以执行current_magic += inp[i]
    • 情况二:字符相同时:当inp[i] == inp[i - 1],即当前字符与前一个字符相等,此时当前正在构建的 “神奇数列” 中断了。这时需要检查当前 “神奇数列” 的长度是否大于等于 3,如果是,则将当前的current_magic与已记录的最长的max_magic进行比较。如果current_magic更长,就更新max_magiccurrent_magic;否则保持max_magic不变。然后重新开始构建新的 “神奇数列”,将current_magic赋值为当前字符inp[i]
  • 最后检查

    • 在遍历完整个字符串后,还需要再检查一次最后正在构建的current_magic是否满足长度大于等于 3 且比已记录的max_magic更长的条件。如果满足,同样更新max_magic
  • 返回结果

    • 最后函数返回max_magic,即找到的最长的 “神奇数列”。如果整个过程中没有找到符合条件(长度大于等于 3)的 “神奇数列”,则返回空字符串。

总的来说,这段代码通过依次遍历输入字符串中的字符,根据字符的交替情况不断构建和更新可能的 “神奇数列”,最终找出符合题目要求的最长的 “神奇数列” 并返回。

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:
        # 如果当前字符与前一个字符相等,检查当前神奇数列的长度是否大于 2
        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