问题描述
小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_magic为current_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