刷题笔记 找出最长的神奇数列 题解 | 豆包MarsCode AI刷题

64 阅读4分钟

问题描述

小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_lengthmax_substring 来记录当前找到的最长「神奇数列」。 如果当前子串的长度大于 max_length,则更新 max_lengthmax_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")