找出最长的神奇数列
问题描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由0和1组成的正整数序列,长度为n。这个序列中的1和0交替出现,且至少由3个连续的0和1组成的部分数列称为「神奇数列」。例如,10101是一个神奇数列,而1011不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
测试样例
-
样例1:
- 输入:
inp = "0101011101" - 输出:
'010101'
- 输入:
-
样例2:
- 输入:
inp = "1110101010000" - 输出:
'10101010'
- 输入:
-
样例3:
- 输入:
inp = "1010101010101010" - 输出:
'1010101010101010'
- 输入:
代码实现
def solution(inp):
n = len(inp)
max_length = 0
longest_magic_sequence = ""
i = 0
while i < n:
# 发现一个潜在的神奇数列
start = i
while i < n - 1 and inp[i] != inp[i + 1]:
i += 1
# 检查当前神奇数列的长度
current_length = i - start + 1
# 更新最长的神奇数列
if current_length >= 3 and current_length > max_length:
max_length = current_length
longest_magic_sequence = inp[start:i + 1]
# 移动到下一个可能的开始位置
i += 1
return longest_magic_sequence
if __name__ == "__main__":
print(solution("0101011101") == "010101")
print(solution("1110101010000") == "10101010")
print(solution("1010101010101010") == "1010101010101010")
分析与思考
在这个问题中,我们需要找到一个由0和1组成的序列中最长的「神奇数列」,即该数列中至少包含3个连续的0和1。为了实现这一目标,我们可以采用滑动窗口的方法来遍历整个序列,并记录下每个潜在神奇数列的起始位置和长度。如果当前数列的长度大于等于3并且比之前记录的最长神奇数列更长,我们就更新最长神奇数列的信息。
具体步骤
- 初始化变量:首先,我们初始化一些变量,包括序列的长度
n、最大长度max_length以及最长的神奇数列longest_magic_sequence。 - 遍历序列:使用一个循环遍历整个序列。对于每一个字符,我们检查它是否与下一个字符不同(即是否形成了一个交替的数列)。如果是,则继续向后遍历,直到遇到相同的字符为止。
- 计算长度:在每次找到一段交替数列后,计算其长度。如果长度大于等于3并且比当前记录的最大长度要长,则更新最大长度和最长神奇数列。
- 返回结果:最后,返回最长的神奇数列。
通过这种方法,我们可以有效地找到最长的神奇数列,并且保证时间复杂度为O(n),因为我们只需要遍历一次序列。
个人思考与总结
这个问题不仅考察了基本的字符串操作能力,还涉及到了一些算法设计的思想。通过滑动窗口的方法,我们可以高效地解决这类问题。此外,我们还需要注意边界条件的处理,比如当序列长度小于3时,直接返回空字符串即可。
在实际编程过程中,除了掌握基本的数据结构和算法外,还需要培养良好的编码习惯和调试技巧。通过不断地练习和总结,我们可以提高自己的编程能力和解决问题的能力。