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

48 阅读2分钟

问题描述

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

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

测试样例

样例1:

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

样例2:

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

样例3:

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

任务

你需要编写一个函数 solution(dna_sequence),该函数接受一个字符串 dna_sequence 作为输入,并返回该序列的最小字典序表示。

要求

  • 函数应返回一个字符串,表示输入序列的最小字典序表示。
  • 确保你的代码能够处理不同长度的输入序列。

问题理解

我们需要找到一个环状 DNA 序列的最小字典序表示。环状序列意味着可以从任意位置开始读取,因此一个长度为 n 的序列实际上有 n 种不同的表示方式。

算法步骤

  1. 生成所有可能的表示:对于一个长度为 n 的序列,我们可以通过将序列的每个位置作为起始点来生成所有可能的表示。
  2. 比较所有表示:将所有生成的表示进行字典序比较,找到最小的那个。
def solution(dna_sequence):
    n = len(dna_sequence)
    min_sequence = dna_sequence  # 初始化最小序列
    
    for i in range(n):
        # 生成从位置 i 开始的表示
        current_sequence = dna_sequence[i:] + dna_sequence[:i]
        
        # 比较当前表示与最小序列
        if current_sequence < min_sequence:
            min_sequence = current_sequence
    
    return min_sequence
​
if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("ATCA") == "AATC")
    print(solution("CGAGTC") == "AGTCCG")
    print(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")