题目分析:
神奇数列满足的条件如下:
- 序列中的0和1必须交替出现
- 序列必须至少包含3个连续且交替出现的0和1,所以最短的神奇数列的长度为3(例如,101或是010)
思路:
遍历整个序列并且同时记录交替出现的0和1子序列部分,逐步寻找和比较,选出最长的满足条件的子序列,代码的具体实现分为以下几个步骤:
-
初始化变量
max_len:记录当前找到的最长的连续交替出现的0和1的神奇数列的长度。start:记录当前最长的交替出现的0和1的神奇数列的起始位置,用于最后返回最长神奇数列时提取子序列。current_len:记录当前正在遍历的交替出现的子序列的长度。
-
遍历序列
-
检查交替:如果当前元素
inp[i]和前一个元素inp[i-1]不同,就说明当前的元素序列是交替的,所以我们把current_len加 1。 -
交替被打断:如果当前元素和前一个元素相同,说明截止至前一个元素,当前的交替出现0和1的序列,其交替被打断了。这时候我们需要检查当前交替出现0和1的子序列是否满足题目分析中提到的神奇数列的两个条件,即交替出现的0和1的长度是否至少为3。
- 如果满足这两个条件并且当前的
current_len比max_len更长,那么我们就更新max_len和start_index的数值。 - 但不论是否满足这两个条件,我们都需要把
start重置为i-current_len,因为下一个交替出现0和1的子序列,其起始位置与这次的交替子序列的起始位置不一样,且我们还需要重置current_len为 1,因为新一轮的交替序列从当前位置重新开始。
- 如果满足这两个条件并且当前的
-
-
最后的检查 遍历结束后,可能会有一个神奇数列在结尾没有被记录,因此需要再检查一次最后的
current_len是否满神奇数列」的条件。 -
返回值
最后,根据
max_len的值来决定是否存在神奇数列:- 如果
max_len >= 3,则提取从start开始、长度为max_len的子序列,即最长的神奇数列。 - 如果没有满足条件的神奇数列,返回空字符串
""。
- 如果