AI刷题-T40 环状DNA的最小序列 题解 | 豆包MarsCode AI刷题

30 阅读2分钟

2024-11-26

整体思路

目的是在给定的环状DNA碱基序列的所有可能表示方式中,找到字典序最小的序列,也就是该环状DNA序列的“最小表示”。它通过生成所有可能的表示方式,然后对这些表示进行排序,最终返回字典序最小的那个表示。

代码细节分析

  1. 初始化结果列表并生成所有可能的序列表示

    • java.util.ArrayList<String> res = new java.util.ArrayList<>();:首先创建一个ArrayList对象res,用于存储环状DNA序列的所有可能表示方式。
    • 接下来通过两层嵌套循环来生成所有可能的表示:
      • 外层循环 for (int i = 0; i < dna_sequence.length(); ++i):这个循环遍历环状DNA序列的每个位置,因为从每个位置开始读取都能得到一种不同的表示方式,所以循环次数等于序列的长度n。这里的i表示起始读取位置。
      • 内层循环 for (int j = 0; j < dna_sequence.length(); ++j):对于每个起始读取位置i,内层循环用于根据该起始位置生成一种完整的序列表示。在内层循环中,通过 s.append(dna_sequence.charAt((i + j) % dna_sequence.length())); 来构建序列。这里的关键在于 (i + j) % dna_sequence.length(),它实现了循环读取环状DNA序列的效果。当j0开始逐渐增加时,通过取余操作,使得索引始终在序列长度范围内,从而正确地从起始位置i开始,依次读取环状序列中的每个碱基,构建出一种完整的序列表示。
      • 每生成一种序列表示,就通过 res.add(s.toString()); 将其添加到结果列表res中。
  2. 对所有可能的表示进行排序

    • res.sort(null);:这行代码使用了ArrayListsort方法对列表res中的所有字符串进行排序。这里传入null作为参数,表示使用字符串的默认比较方法,即按照字典序进行比较。排序完成后,列表res中的元素将按照字典序从小到大排列。
  3. 返回字典序最小的表示

    • return res.get(0);:在对所有可能的表示进行排序后,列表res中的第一个元素就是字典序最小的序列表示,所以直接返回res.get(0),即为所求的环状DNA序列的“最小表示”。
    public static String solution(String dna_sequence) {
        // Please write your code here
        java.util.ArrayList<String> res = new java.util.ArrayList<>();
for (int i = 0; i < dna_sequence.length(); ++i) {
StringBuilder s = new StringBuilder();
for (int j = 0; j < dna_sequence.length(); ++j) {
s.append(dna_sequence.charAt((i + j) % dna_sequence.length()));
}
res.add(s.toString());
}
res.sort(null);
return res.get(0);
    }