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

137 阅读2分钟

题目分析:

神奇数列满足的条件如下:

  1. 序列中的0和1必须交替出现
  2. 序列必须至少包含3个连续且交替出现的0和1,所以最短的神奇数列的长度为3(例如,101或是010)

思路:

遍历整个序列并且同时记录交替出现的0和1子序列部分,逐步寻找和比较,选出最长的满足条件的子序列,代码的具体实现分为以下几个步骤:

  1. 初始化变量

    • max_len:记录当前找到的最长的连续交替出现的0和1的神奇数列的长度。
    • start:记录当前最长的交替出现的0和1的神奇数列的起始位置,用于最后返回最长神奇数列时提取子序列。
    • current_len:记录当前正在遍历的交替出现的子序列的长度。
  2. 遍历序列

    • 检查交替:如果当前元素 inp[i] 和前一个元素 inp[i-1] 不同,就说明当前的元素序列是交替的,所以我们把 current_len 加 1。

    • 交替被打断:如果当前元素和前一个元素相同,说明截止至前一个元素,当前的交替出现0和1的序列,其交替被打断了。这时候我们需要检查当前交替出现0和1的子序列是否满足题目分析中提到的神奇数列的两个条件,即交替出现的0和1的长度是否至少为3。

      • 如果满足这两个条件并且当前的 current_lenmax_len 更长,那么我们就更新 max_lenstart_index的数值。
      • 但不论是否满足这两个条件,我们都需要把start 重置为i-current_len,因为下一个交替出现0和1的子序列,其起始位置与这次的交替子序列的起始位置不一样,且我们还需要重置 current_len 为 1,因为新一轮的交替序列从当前位置重新开始。
  3. 最后的检查 遍历结束后,可能会有一个神奇数列在结尾没有被记录,因此需要再检查一次最后的 current_len 是否满神奇数列」的条件。

  4. 返回值

    最后,根据 max_len 的值来决定是否存在神奇数列:

    • 如果 max_len >= 3,则提取从 start 开始、长度为 max_len 的子序列,即最长的神奇数列。
    • 如果没有满足条件的神奇数列,返回空字符串 ""