问题描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
理解题目要求:
题目要求在一个由 0 和 1 组成的序列中找到最长的「神奇数列」。 「神奇数列」的定义是:序列中的 0 和 1 交替出现,且至少由 3 个连续的 0 和 1 组成。 数据结构的选择:
由于我们处理的是字符串,可以直接使用字符串操作来解决问题。
算法步骤:
遍历字符串:
从字符串的每个位置开始,尝试找到符合条件的子串。
检查子串是否为「神奇数列」:
子串长度至少为3。 子串中的字符必须交替出现,即相邻字符不能相同。
记录最长的「神奇数列」:
如果当前子串的长度大于之前记录的最长子串长度,则更新最长子串。 如果有多个长度相同的「神奇数列」,记录最先出现的一个。
优化思路:
由于我们需要检查每个子串是否为「神奇数列」,可以考虑在遍历过程中进行剪枝,避免不必要的检查。 例如,如果当前子串已经不符合「神奇数列」的条件,可以提前终止内层循环。 通过以上步骤,我们可以有效地找到最长的「神奇数列」。
主要代码实现
遍历字符串:
用了两个嵌套的 for 循环来遍历字符串中的所有可能的子串。外层循环从字符串的每个位置开始,内层循环从当前位置开始,尝试找到符合条件的子串。
检查子串是否为「神奇数列」:
定义了一个辅助函数 is_magic_sequence,用于检查子串是否符合「神奇数列」的定义。
在 is_magic_sequence 函数中,首先检查子串长度是否至少为3。
然后,通过遍历子串中的字符,检查相邻字符是否相同。如果相邻字符相同,则返回 False,表示该子串不是「神奇数列」。
记录最长的「神奇数列」:
在主函数 solution 中,你使用 max_length 和 max_substring 来记录当前找到的最长「神奇数列」。
如果当前子串的长度大于 max_length,则更新 max_length 和 max_substring。
返回结果:
最后,函数返回最长的「神奇数列」。
总结
在这道题目中,我们需要在一个由 0 和 1 组成的序列中找到最长的「神奇数列」,即序列中的 0 和 1 交替出现,且至少由 3 个连续的 0 和 1 组成。通过遍历字符串并检查每个子串是否符合「神奇数列」的定义,我们可以有效地找到最长的符合条件的子串。
在实现过程中,我们使用了两个嵌套的 for 循环来遍历字符串中的所有可能的子串,并定义了一个辅助函数 is_magic_sequence 来检查子串是否符合「神奇数列」的定义。通过记录当前找到的最长「神奇数列」,我们最终返回了符合条件的最长子串。
总结来说,这道题目不仅考察了对字符串操作的理解,还要求我们在遍历过程中进行有效的检查和记录。通过合理的算法设计和优化,我们可以提高代码的效率,更好地解决这类问题。
完整代码
def solution(inp):
max_length = 0
max_substring = ""
# 遍历字符串,检查每个子串是否是「神奇数列」
for i in range(len(inp)):
for j in range(i + 3, len(inp) + 1): # 子串长度至少为3
substring = inp[i:j]
# 检查子串是否是「神奇数列」
if is_magic_sequence(substring):
# 更新最长「神奇数列」
if len(substring) > max_length:
max_length = len(substring)
max_substring = substring
return max_substring
def is_magic_sequence(substring):
# 检查子串长度是否至少为3
if len(substring) < 3:
return False
# 检查子串是否是「神奇数列」
for i in range(1, len(substring)):
if substring[i] == substring[i - 1]:
return False
return True
if __name__ == "__main__":
print(solution("0101011101") == "010101")