我们的问题是要在一个由0和1组成的字符串中,找到最长的交替子串(即“神奇数列”)。这个子串必须至少包含3个连续的0和1交替出现,且当有多个符合条件的子串时,返回最先出现的一个。
思路解析
我们可以通过遍历输入字符串的每一个字符,逐个检查字符之间是否交替。如果交替,则将当前的子串继续延伸;如果不交替,则将当前交替序列的长度与已记录的最大序列进行比较,并更新最大序列。
具体步骤如下:
-
初始化:
max_seq:用来存储目前找到的最长交替子串。current_seq:用来存储当前正在构建的交替子串。
-
遍历输入字符串:
- 如果当前字符与前一个字符不同,则属于交替子串的一部分,继续将其添加到
current_seq。 - 如果当前字符与前一个字符相同,则意味着交替子串结束,检查当前的
current_seq长度是否大于max_seq,如果是则更新max_seq。 - 然后重置
current_seq为当前字符,继续从新字符开始构建交替序列。
- 如果当前字符与前一个字符不同,则属于交替子串的一部分,继续将其添加到
-
检查结束时的情况:
- 在循环结束后,我们可能会有一个最后的交替子串(因为没有继续遇到不交替的字符),因此需要再检查一次。
-
返回结果:
- 最后返回
max_seq,即为最长的交替子串。
- 最后返回
代码实现
def solution(inp):
max_seq = "" # 初始化最长交替序列为空
current_seq = inp[0] # 初始化当前交替序列为第一个字符
# 从第二个字符开始遍历
for i in range(1, len(inp)):
# 如果当前字符与前一个字符交替
if inp[i] != inp[i - 1]:
current_seq += inp[i]
else:
# 如果当前交替序列长度 >= 3 且比已知最大序列长
if len(current_seq) >= 3 and len(current_seq) > len(max_seq):
max_seq = current_seq
# 重置当前交替序列为新的起点
current_seq = inp[i]
# 最后检查一下循环结束后的当前序列
if len(current_seq) >= 3 and len(current_seq) > len(max_seq):
max_seq = current_seq
return max_seq
代码解析
max_seq:用于记录当前找到的最长的交替子串。current_seq:用于存储正在检查的交替子串。每当遇到连续不交替的字符时,会检查current_seq的长度,判断是否更新max_seq,然后重置current_seq为当前字符。- 在最后一次循环结束后,我们还需要检查一下
current_seq是否为最长的交替子串,因为在整个遍历过程中,最后的交替子串可能是最好的。
示例
示例 1:
输入:"0101011101"
- 遍历到字符
0时,current_seq变为"010", 再到"0101",max_seq = "010101", 最终返回"010101"。
输出:"010101"
示例 2:
输入:"1110101010000"
- 遍历时从
"10101010"得到最长的交替子串。返回"10101010"。
输出:"10101010"
示例 3:
输入:"1010101010101010"
- 整个序列都是交替的,长度大于3,所以最终返回整个序列。
输出:"1010101010101010"
时间复杂度
- 时间复杂度:遍历一次字符串,时间复杂度为O(n),其中n是输入字符串的长度。
- 空间复杂度:额外空间只存储
max_seq和current_seq,因此空间复杂度是O(1)。
总结
这个问题可以通过遍历字符串并动态构建交替子串来解决。通过有效地判断交替的条件,并在合适的时候更新最长的交替子串,我们能够找到符合条件的最长子串。