AI刷题 128.找出最长的神奇数列 | 豆包MarsCode AI刷题

90 阅读2分钟

128.找出最长的神奇数列

问题描述

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?

如果有多个神奇数列,那么输出最先出现的一个。


1.思路

1.寻找相同点

题目中序列只由1和0构成,而神奇数列要求1和0交替出现,那么可推当11,00出现时,上一个神奇数列结束(若有),下一个神奇数列开始(若有),因此存储相同点作为寻找点

2.截取神奇数列

从相同点往前判断上一个相同点,若大于3,则满足题目对神奇数列的要求,利用substr()将其截取并存储

3.寻找最长神奇数列

在每次寻找到神奇数列后,和max做比较,若大于max,则更换max值和res字符串,若小于等于则不变(保证输出最先出现的最长神奇数列)

2.注意事项

1.初始化

maxxres 必须初始化为 0"",否则会导致结果错误。 index 用于记录上一个相同点位置,i用于记录当前相同点位置

2.边界问题

如果序列以神奇数列结尾,例如 "1010101",需要在循环外单独检查最后一个神奇数列。 当两个神奇数列长度相同时,程序会自动选择第一个出现的,因为 res 只在发现更长序列时更新。

3.复杂度

时间复杂度:遍历字符串,时间复杂度为O(n) 空间复杂度:n大小字符串,空间复杂度为O(n)

代码实现

def solution(inp):
    index = 0
    maxx = 0
    length = 0
    res = ''
    for i in range(1, len(inp)):
        if inp[i] != inp[i - 1]:
            if i == len(inp) - 1:
                length = i - index
                if length >= 3:
                    if length > maxx:
                        maxx = length
                        res = inp[index:i + 1]
                index = i
            else:
                continue
        else:
            length = i - index
            if length >= 3:
                if length > maxx:
                    maxx = length
                    res = inp[index:i]
            index = i
    if res == '' and maxx>=3:
        res = inp
    return res

if __name__ == "__main__":
    print(solution("01111110110111000010101") == "010101")