本文最后更新于 189 天前,其中的信息可能已经有所发展或是发生改变。
问题描述
在生物学中,DNA 序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA 序列,每条序列由 A、C、G、T 四种字符组成,长度相同。但是现在我们记录的 DNA 序列存在错误,为了严格满足 DNA 序列的碱基互补配对即 A – T 和 C – G,我们需要依据第一条 DNA 序列对第二条 DNA 序列进行以下操作:
- 选择第二条 DNA 序列的任意两个位置,交换他们的字符。
- 选择第二条 DNA 序列任意一个位置,将其字符替换为 A、C、G、T 中的任何一个。
需要注意的是:每个位置上的碱基只能被操作一次!
你的任务是通过最小的操作次数,使第二条 DNA 序列和第一条 DNA 序列互补。并且已知初始两条 DNA 序列长度均为 NN。
输入格式
第一行包含一个整数 NN,(1≤N≤103)(1≤N≤103),表示 DNA 序列的长度。
接下来的两行,每行包含一个长度为 NN 的字符串,表示两条 DNA 序列。
输出格式
输出一个整数,表示让第二条 DNA 序列和第一条 DNA 序列互补所需的最小操作次数。
样例输入
5
ACGTG
ACGTC
样例输出
2
样例说明
将第二条 DNA 序列中的第一个和第四个碱基交换,将第二个和第三个碱基交换即可完成全部配对,共操作两次。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 128M |
C | 1s | 128M |
Java | 2s | 128M |
Python3 | 3s | 128M |
答案解析:
#include <iostream>
using namespace std;
int main()
{
int n,t = 0;cin>>n;
string a,b;
cin>>a>>b;
for(auto &x:a){
if(x=='A') x = 'T';
else if(x=='C')x = 'G';
else if(x=='G')x = 'C';
else if(x=='T')x = 'A';
}
for(int i = 0;i<n;i++){
if(a[i]==b[i]) continue;
for(int j = i+1;j<n;j++){
if(a[i]==b[j]&&a[j]==b[i]) swap(b[j],b[i]);
}
t++;
}
cout<<t<<endl;
return 0;
}