问题描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
问题分析
我们给定一个由 0 和 1 组成的字符串 inp,目标是找到其中最长的「神奇数列」。所谓「神奇数列」,就是:
- 该子序列由
0和1交替构成。 - 且该子序列的长度至少为 3。
我们需要输出最长的「神奇数列」,如果存在多个相同长度的子序列,则输出最先出现的一个。
示例
示例 1
输入:
inp = "0101011101"
输出:
'010101'
示例 2
输入:
inp = "1110101010000"
输出:
'10101010'
思路
这个问题的核心在于遍历字符串并寻找最长的交替子序列。
- 遍历字符串:我们逐个字符检查字符串中的字符是否与前一个字符交替。
- 构建当前神奇数列:如果当前字符与前一个字符交替(即不相等),我们就将其加入当前的「神奇数列」。
- 结束当前神奇数列:如果当前字符与前一个字符相等(即没有交替),我们需要检查当前构建的神奇数列是否满足长度要求(至少为 3),如果满足,就更新最长的神奇数列。
- 返回结果:遍历结束后,再检查一次当前构建的神奇数列,确保最后的神奇数列是最长的。
代码实现
下面是基于以上思路的 Python 代码实现:
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:
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
# 测试用例
if __name__ == "__main__":
print(solution("0101011101") == "010101")
print(solution("10101") == "10101")
print(solution("11100") == "")
print(solution("010") == "010")
print(solution("1") == "")
代码解读
-
初始化:
max_magic用来存储最长的「神奇数列」。current_magic用来存储当前正在构建的「神奇数列」。
-
遍历字符串:
- 从字符串的第二个字符开始(索引 1),逐个检查当前字符与前一个字符是否交替。
- 如果交替(即当前字符与前一个字符不同),我们将当前字符添加到
current_magic中,继续构建当前的神奇数列。 - 如果没有交替,检查当前神奇数列的长度是否满足条件(长度至少为 3),并更新
max_magic。
-
检查:
- 遍历结束后,我们还需要检查最后一个构建的神奇数列是否是最长的,如果满足条件(长度至少为 3),就更新
max_magic。
- 遍历结束后,我们还需要检查最后一个构建的神奇数列是否是最长的,如果满足条件(长度至少为 3),就更新
-
返回结果:
- 最后返回最长的神奇数列。如果没有满足条件的子序列,则返回空字符串。
时间复杂度分析
- 时间复杂度:
O(n),其中n是字符串inp的长度。我们只需要遍历字符串一次。 - 空间复杂度:
O(n),主要用来存储max_magic和current_magic。