找出最长的神奇序列| 豆包MarsCode AI刷题

53 阅读3分钟

我们的问题是要在一个由0和1组成的字符串中,找到最长的交替子串(即“神奇数列”)。这个子串必须至少包含3个连续的0和1交替出现,且当有多个符合条件的子串时,返回最先出现的一个。

思路解析

我们可以通过遍历输入字符串的每一个字符,逐个检查字符之间是否交替。如果交替,则将当前的子串继续延伸;如果不交替,则将当前交替序列的长度与已记录的最大序列进行比较,并更新最大序列。

具体步骤如下:

  1. 初始化

    • max_seq:用来存储目前找到的最长交替子串。
    • current_seq:用来存储当前正在构建的交替子串。
  2. 遍历输入字符串

    • 如果当前字符与前一个字符不同,则属于交替子串的一部分,继续将其添加到current_seq
    • 如果当前字符与前一个字符相同,则意味着交替子串结束,检查当前的current_seq长度是否大于max_seq,如果是则更新max_seq
    • 然后重置current_seq为当前字符,继续从新字符开始构建交替序列。
  3. 检查结束时的情况

    • 在循环结束后,我们可能会有一个最后的交替子串(因为没有继续遇到不交替的字符),因此需要再检查一次。
  4. 返回结果

    • 最后返回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"

  1. 遍历到字符0时,current_seq变为"010", 再到"0101", max_seq = "010101", 最终返回"010101"

输出:"010101"

示例 2:

输入:"1110101010000"

  1. 遍历时从"10101010"得到最长的交替子串。返回"10101010"

输出:"10101010"

示例 3:

输入:"1010101010101010"

  1. 整个序列都是交替的,长度大于3,所以最终返回整个序列。

输出:"1010101010101010"

时间复杂度

  • 时间复杂度:遍历一次字符串,时间复杂度为O(n),其中n是输入字符串的长度。
  • 空间复杂度:额外空间只存储max_seqcurrent_seq,因此空间复杂度是O(1)。

总结

这个问题可以通过遍历字符串并动态构建交替子串来解决。通过有效地判断交替的条件,并在合适的时候更新最长的交替子串,我们能够找到符合条件的最长子串。