按 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。从左到右逐位替换输出即可,时间复杂度
参考代码
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;
}