问题描述
小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")
代码解读:
这段Python代码定义了一个名为 solution 的函数,其目的是在一个给定的字符串 inp 中找到最长的“神奇数列”。神奇数列的定义是:数列中不包含连续的两个字符相同的子序列。下面是对代码的详细解读:
-
函数定义:
def solution(inp):定义了一个名为solution的函数,它接受一个字符串参数inp。
-
初始化变量:
n = len(inp):计算输入字符串inp的长度。max_length = 0:初始化一个变量max_length用来记录最长神奇数列的长度。longest_magic_sequence = "":初始化一个空字符串longest_magic_sequence用来存储最长的神奇数列。
-
寻找神奇数列:
i = 0:初始化一个索引i用来遍历字符串inp。while i < n::开始一个循环,直到i遍历完整个字符串。
-
检查潜在的神奇数列:
start = i:记录当前潜在神奇数列的起始位置。while i < n - 1 and inp[i] != inp[i + 1]::内层循环,检查从当前位置开始的字符是否不与下一个字符相同,如果不同则继续向后移动。
-
更新神奇数列长度:
current_length = i - start + 1:计算当前找到的神奇数列的长度。if current_length >= 3 and current_length > max_length::如果当前神奇数列的长度大于3(因为神奇数列至少需要3个字符)并且大于之前记录的最长长度,更新max_length和longest_magic_sequence。
-
移动到下一个位置:
i += 1:外层循环结束后,将i加1,移动到下一个可能的起始位置。
-
返回结果:
return longest_magic_sequence:函数返回找到的最长神奇数列。
-
主程序:
if __name__ == "__main__"::这部分代码在直接运行该脚本时执行。print(solution("0101011101") == "010101")等三行代码是测试用例,用于验证函数的正确性。每个print语句都检查solution函数的返回值是否符合预期。
这段代码的关键在于通过两个嵌套循环来寻找和更新最长的神奇数列。外层循环遍历整个字符串,内层循环检查从当前位置开始的字符序列是否满足神奇数列的条件。这种方法简单且高效,能够找到给定字符串中的最长神奇数列。