文章

【GESP】C++三级练习 luogu-B2114 配对碱基链

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★✮☆☆☆。

luogu-B2114 配对碱基链

题目要求

题目描述

脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。

而构成 DNA 的碱基共有 $4$ 种:

  • 分别为腺嘌呤($A$)

  • 鸟嘌呤($G$)

  • 胸腺嘧啶($T$)

  • 胞嘧啶($C$)

我们知道,在两条互补碱基链的对应位置上,腺嘌呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。

你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

输入格式

一个字符串,表示一条碱基链。

这个字符串只含有大写字母 $A$ 、 $T$ 、 $G$ 、 $C$,分别表示腺嘌呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。

字符串长度不超过 $255$。

输出格式

一个只含有大写字母 $A$ 、 $T$ 、 $G$ 、 $C$ 的字符串,为与输入的碱基链互补的碱基链。

输入输出样例 #1

输入 #1

1
ATATGGATGGTGTTTGGCTCTG

输出 #1

1
TATACCTACCACAAACCGAGAC

题目分析

解题思路

  1. 题目要求根据输入的DNA单链碱基序列,输出其互补链的碱基序列。

  2. 解题关键点:
    • 理解DNA碱基互补配对规则:A配对T,G配对C
    • 字符串的遍历和替换操作
    • 确保正确处理每个碱基的配对关系
    • 输出结果为一行字符串
  3. 具体思路:
    • 读取输入的DNA序列字符串
    • 创建等长的结果字符串
    • 遍历DNA序列,根据配对规则转换每个碱基:
      • 遇到A转换为T
      • 遇到T转换为A
      • 遇到G转换为C
      • 遇到C转换为G
    • 输出互补碱基链
  4. 时间复杂度分析:
    • 需要遍历一次字符串,时间复杂度为O(n),其中n为字符串长度
    • 空间复杂度为O(n),需要存储互补链字符串


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<string>

int main(){
    // 声明输入字符串变量
    std::string str;
    // 从标准输入读取DNA序列
    std::cin>>str;
    // 创建结果字符串,初始化为相同长度的空字符串
    std::string r_str = std::string(str.size(), '\0');
    // 遍历输入字符串的每个字符
    for(int i = 0; i < str.size(); i++){
        // 根据碱基配对规则进行转换
        // T配对A
        if (str[i] == 'T') {
            r_str[i] = 'A';
        } 
        // A配对T
        else if(str[i] == 'A') {
            r_str[i] = 'T';
        } 
        // G配对C
        else if(str[i] == 'G') {
            r_str[i] = 'C';
        } 
        // C配对G
        else if(str[i] == 'C') {
            r_str[i] = 'G';
        }
    }
    // 输出互补碱基链
    std::cout<<r_str;
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权