问题描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
测试样例
样例1:
输入:
inp = "0101011101"
输出:'010101'
样例2:
输入:
inp = "1110101010000"
输出:'10101010'
样例3:
输入:
inp = "1010101010101010"
输出:'1010101010101010'
解题思路
首先,我们需要理解「神奇数列」的定义:它是一个由 0 和 1 交替组成的序列,且至少由 3 个连续的 0 和 1 组成。
- 遍历输入字符串:我们需要遍历整个输入字符串,检查每个可能的子序列是否符合「神奇数列」的定义。
- 检查子序列:对于每个子序列,我们需要检查它是否由
0和1交替组成,并且长度至少为 3。 - 记录最长的神奇数列:在遍历过程中,如果发现更长的神奇数列,就更新记录。
代码提示
我们可以通过以下步骤来实现这个逻辑:
- 初始化变量:我们需要一个变量来记录当前找到的最长神奇数列。
- 遍历字符串:使用两个嵌套的循环来遍历所有可能的子序列。
- 检查子序列:对于每个子序列,检查它是否符合神奇数列的定义。
- 更新最长神奇数列:如果找到更长的神奇数列,更新记录。
Python3代码(通过豆包Marscode测试)
def solution(inp):
max_magic_sequence = ""
# 遍历所有可能的子序列
for i in range(len(inp)):
for j in range(i + 3, len(inp) + 1):
subseq = inp[i:j]
# 检查子序列是否为神奇数列
if is_magic_sequence(subseq):
# 如果当前子序列比已记录的最长神奇数列更长,更新记录
if len(subseq) > len(max_magic_sequence):
max_magic_sequence = subseq
return max_magic_sequence
# 辅助函数:检查子序列是否为神奇数列
def is_magic_sequence(subseq):
# 检查子序列是否由0和1交替组成
for k in range(1, len(subseq)):
if subseq[k] == subseq[k - 1]:
return False
return True
if __name__ == "__main__":
print(solution("0101011101") == "010101")
关键步骤
- 遍历所有可能的子序列:使用两个嵌套的循环来遍历所有可能的子序列。
- 检查子序列是否为神奇数列:编写一个辅助函数
is_magic_sequence来检查子序列是否由0和1交替组成。 - 更新最长神奇数列:在遍历过程中,如果找到更长的神奇数列,更新记录。
时间复杂度
- 外层循环:遍历字符串的所有可能的起始位置,时间复杂度为
O(n),其中n是字符串的长度。 - 内层循环:对于每个起始位置,遍历所有可能的结束位置,时间复杂度为
O(n)。 - 检查子序列:对于每个子序列,检查它是否为神奇数列,时间复杂度为
O(m),其中m是子序列的长度。
综合起来,总的时间复杂度为 O(n^3),因为在最坏情况下,每个子序列都需要检查。
空间复杂度
- 存储子序列:在检查子序列时,需要存储当前的子序列,空间复杂度为
O(m),其中m是子序列的长度。 - 存储最长神奇数列:需要存储当前找到的最长神奇数列,空间复杂度为
O(n)。
综合起来,总的空间复杂度为 O(n)