环状DNA序列最小表示方法| 豆包MarsCode AI 刷题

96 阅读2分钟

这个问题的目标是从环状的 DNA 序列中找到字典序最小的表示。环状结构意味着我们可以从序列的任何位置开始读取,而我们需要找到所有这些可能的序列表示中的字典序最小的一个。

思路分析: 理解环状序列:给定一个 DNA 序列,假设该序列的长度为 n。由于是环状的,我们可以从任意位置开始读取序列。例如,对于序列 ATCA,它的所有可能的表示为:

从位置 0 开始读取:ATCA 从位置 1 开始读取:TCAA 从位置 2 开始读取:CAAT 从位置 3 开始读取:AATC 寻找字典序最小的表示:字典序比较的基本规则是按字符逐位比较,较小的字符排在前面。如果某个表示的序列比其他的字典序小,它就应该是最小的表示。

算法思路:

首先,列举出从每个位置开始的所有可能的表示。 然后,选择其中字典序最小的表示。 直接生成所有这些旋转序列并进行排序是一个可行的解决方法。 优化:我们不需要显式地构建所有的旋转字符串,然后排序。我们可以通过遍历序列并在每一步中选择当前字典序最小的旋转表示。

def min_dna_sequence(dna_sequence): n = len(dna_sequence) # 构造一个由dna_sequence重复两次的字符串 extended_sequence = dna_sequence * 2

# 初始化最小表示,最初选择第一个位置作为最小表示
min_rotation = dna_sequence

# 比较每一个可能的旋转
for i in range(1, n):
    # 当前旋转的序列是从i开始的长度为n的子串
    current_rotation = extended_sequence[i:i+n]
    # 更新最小表示
    if current_rotation < min_rotation:
        min_rotation = current_rotation

return min_rotation