配对碱基链

GitHub跳转原题关系图返回列表

按 A↔T、G↔C 的配对规则逐位替换,一遍扫描输出互补链。

OJ: roj

题目 ID: 1135

难度:入门

标签:入门字符串映射python

创建: 2026-09-29 20:26

更新: 2026-10-05 02:58

题目描述

DNA 的两条互补链在对应位置上按 A 与 T 配对、G 与 C 配对。给定一条只含 A、T、G、C 的碱基链(长度不超过 255),求它的互补链。输入一行表示一条碱基链,输出一行表示与它互补的碱基链。样例输入 ATATGGATGGTGTTTGGCTCTG,输出 TATACCTACCACAAACCGAGAC。

思路

每个位置的互补碱基只由该位置自己的碱基决定,与相邻位置无关:A 换成 T、T 换成 A、G 换成 C、C 换成 G。从左到右逐位替换输出即可,时间复杂度 O(n)O(n)。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 20:26
# update_at: 2026-09-29 20:26

import sys

# 互补关系只有两对:A↔T、G↔C;对照着写 "ATGC"/"TACG" 就是一张双向翻译表
COMPLEMENT = str.maketrans("ATGC", "TACG")


def solve() -> None:
    data = iter(sys.stdin.buffer.read().split())
    chain: str = next(data).decode()

    # 每位碱基的互补碱基只由自己决定,整条链可以交给 translate 一次替换完
    print(chain.translate(COMPLEMENT))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 02:58
 * update_at: 2026-10-05 02:58
 */

#include <cstdio>

typedef long long ll;

const int MAXN = 260;

char s[MAXN]; // s 存输入的碱基链,长度不超过 255

int main() {
    scanf("%s", s);

    // 每个位置的互补碱基只由自己决定,与左右邻居无关,逐位替换即可
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] == 'A')
            putchar('T');
        else if (s[i] == 'T')
            putchar('A');
        else if (s[i] == 'G')
            putchar('C');
        else
            putchar('G'); // 只剩 'C',配对成 'G'
    }
    putchar('\n');

    return 0;
}