青训营X豆包MarsCode 技术训练营:环状 DNA 序列的最小表示法Python3题解 | 豆包MarsCode AI 刷题

77 阅读3分钟

问题描述

小C正在研究一种环状的 DNA 结构,它由四种碱基ACGT构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。

例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCATCAACAATAATC,其中 AATC 是字典序最小的表示。


测试样例

样例1:

输入:dna_sequence = "ATCA"
输出:'AATC'

样例2:

输入:dna_sequence = "CGAGTC"
输出:'AGTCCG'

样例3:

输入:dna_sequence = "TTGAC"
输出:'ACTTG'

解题思路

  1. 理解问题:我们需要找到一个环状序列的所有可能表示,并从中选择字典序最小的那个。

  2. 生成所有可能的表示:对于一个长度为 n 的序列,我们可以通过将其复制一次(即 dna_sequence + dna_sequence),然后从每个位置开始截取长度为 n 的子串来生成所有可能的表示。

  3. 比较字典序:我们可以使用 Python 的字符串比较功能来找到字典序最小的表示。

Python3代码(通过豆包Marscode测试)

def solution(dna_sequence):
    n = len(dna_sequence)
    # 生成所有可能的表示
    possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]
    
    # 找到字典序最小的表示
    min_representation = min(possible_representations)
    
    return min_representation

if __name__ == "__main__":
    # 你可以添加更多测试用例
    print(solution("ATCA") == "AATC")
    print(solution("CGAGTC") == "AGTCCG")
    print(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")

关键步骤解释

  1. 生成所有可能的表示

    possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]
    

    这行代码通过将 dna_sequence 复制一次,并从每个位置开始截取长度为 n 的子串,生成所有可能的表示。

  2. 找到字典序最小的表示

    min_representation = min(possible_representations)
    

    这行代码使用 Python 的 min 函数来找到字典序最小的表示。

时间复杂度

  1. 生成所有可能的表示

    possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]
    

    这一步需要遍历 dna_sequence 的所有位置,并对每个位置生成一个新的字符串。生成每个字符串的时间复杂度是 O(n),因此总的时间复杂度是 O(n^2)

  2. 找到字典序最小的表示

    min_representation = min(possible_representations)
    

    这一步需要遍历 possible_representations 列表,并找到字典序最小的字符串。由于 possible_representations 的长度是 n,因此这一步的时间复杂度是 O(n)

综合来看,生成所有可能的表示的时间复杂度是 O(n^2),找到最小表示的时间复杂度是 O(n)。因此,总的时间复杂度是 O(n^2)

空间复杂度

  1. 生成所有可能的表示

    possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]
    

    这一步生成了一个长度为 n 的列表,每个元素是一个长度为 n 的字符串。因此,总的空间复杂度是 O(n^2)

  2. 其他变量: 除了 possible_representations 列表外,其他变量(如 nmin_representation)的空间复杂度是 O(1)

综合来看,总的空间复杂度是 O(n^2)

总结

  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)