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

41 阅读3分钟

总体思路

要从环状 DNA 序列的多种表示方式中找到字典序最小的序列,我们需要遍历该序列从每个位置开始读取所得到的不同表示,然后通过比较字典序来确定其中最小的那个表示。

solution函数具体思路

1. 初始化相关变量

  • 首先获取输入的 DNA 序列 dna_sequence 的长度 n,这是为了后续能准确地对序列进行不同起始位置的截取和拼接操作。
  • 接着初始化一个字符串变量 min_sequence,并将其赋值为输入的 dna_sequence 本身。这个变量的作用是用于存储在后续比较过程中发现的字典序最小的序列,一开始先将其设为原始序列,以便后续能与从其他位置开始读取得到的序列进行比较并更新。

2. 遍历所有可能的起始位置

通过一个循环 for (int i = 0; i < n; ++i),让变量 i 从 0 到 n - 1 依次取值。这里的 i 表示我们要从 DNA 序列的第 i 个位置开始读取,以获取该环状 DNA 序列的不同表示方式。

3. 获取当前位置开始的序列表示

在每次循环中,对于当前的 i 值,我们通过以下字符串操作来得到从该位置开始读取的 DNA 序列的一种表示方式 current_sequence

  • 首先使用 substr 函数截取从 i 位置到末尾的子串,即 dna_sequence.substr(i)。这部分获取了从当前起始位置 i 往后的序列部分。
  • 然后再使用 substr 函数截取从开头到 i 位置的子串,即 dna_sequence.substr(0, i)。这部分获取了原始序列开头到当前起始位置 i 之前的部分。
  • 最后将这两部分通过加法运算符 + 进行拼接,得到完整的从当前位置 i 开始读取的 DNA 序列的一种表示方式 current_sequence,即 current_sequence = dna_sequence.substr(i) + dna_sequence.substr(0, i)

4. 比较并更新最小序列

得到当前位置 i 开始的序列表示 current_sequence 后,我们将其与之前存储的可能是最小序列的 min_sequence 进行比较。比较操作是通过直接使用小于运算符 < 来判断两个字符串的字典序大小。如果 current_sequence 的字典序小于 min_sequence 的字典序,就说明我们找到了一个更小的序列表示,此时就更新 min_sequence 的值为 current_sequence,即 if (current_sequence < min_sequence) { min_sequence = current_sequence; }

5. 返回最小序列

当循环结束后,经过对所有可能的起始位置进行遍历和比较,min_sequence 中存储的就是字典序最小的序列表示了,最后将其作为函数的返回值返回,即 return min_sequence

  #include <string> 
  std::string solution(std::string dna_sequence) {
       int n = dna_sequence.length(); 
       std::string min_sequence = dna_sequence; 
       for (int i = 0; i < n; ++i) {
           std::string current_sequence = dna_sequence.substr(i) +       dna_sequence.substr(0, i); 
           if (current_sequence < min_sequence) {
               min_sequence = current_sequence; 
           } 
       }
       return min_sequence;
 }
  int main() {
  // You can add more test cases here 
  std::cout << (solution("ATCA") == "AATC") << std::endl; 
  std::cout << (solution("CGAGTC") == "AGTCCG") << std::endl; 
  std::cout << (solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG") << std::endl; 
  return 0; }