青训营—环状DNA序列的最小表示法

113 阅读2分钟

题目描述

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

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

测试样例

样例1

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

样例2

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

样例3

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

思路

在这个问题中,我们需要找到一个环状 DNA 序列的字典序最小表示。由于 DNA 序列是环状的,我们可以从任意位置开始读取序列,因此对于长度为 n 的序列,我们可以生成 n 种不同的表示。我们的目标是从这些表示中找到字典序最小的一个。

Java代码

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static String solution(String dna_sequence) {
        // Please write your code here
        List<String> representations = new ArrayList<>();
        int length = dna_sequence.length();
 
        // 生成所有可能的表示
        for (int i = 0; i < length; i++) {
            String representation = dna_sequence.substring(i) + dna_sequence.substring(0, i);
            representations.add(representation);
        }
 
        // 找到字典序最小的表示
        String minRepresentation = representations.get(0);
        for (String representation : representations) {
            if (representation.compareTo(minRepresentation) < 0) {
                minRepresentation = representation;
            }
        }
 
        return minRepresentation;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution("ATCA").equals("AATC"));
        System.out.println(solution("CGAGTC").equals("AGTCCG"));
        System.out.println(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG").equals("AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG"));
    }
}

复杂度分析

时间复杂度:生成所有表示的时间复杂度为 O(n^2),因为需要生成 n 个表示,每个表示的生成需要 O(n) 的时间;在比较所有表示时,最坏情况下需要 O(n) 的时间来比较两个字符串,因此总的时间复杂度为 O(n^2)。

空间复杂度:使用了一个列表来存储所有的表示,空间复杂度为 O(n),因为存储了 n 个长度为 n 的字符串。