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.初始化
maxx 和 res 必须初始化为 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")