你的任务是通过最小的操作次数,使第二条 DNA 序列和第一条 DNA 序列互补。并且已知初始两条 DNA 序列长度均为 N。
输入格式
第一行包含一个整数 N,(1≤N≤103),表示 DNA 序列的长度。
接下来的两行,每行包含一个长度为 N 的字符串,表示两条 DNA 序列。
输出格式
输出一个整数,表示让第二条 DNA 序列和第一条 DNA 序列互补所需的最小操作次数。
样例输入
5
ACGTG
ACGTC
样例输出
2
#include <bits/stdc++.h>
using namespace std;
int find(string &s1,string &s2,int i,char a,char b) {
while (i < s1.size()) {
if (s2[i] == a && s1[i] == b) return i;
i++;
}
return -1;
}
int main() {
int n,cnt = 0; cin >> n;
string s1,s2; cin >> s1 >> s2;
//通过使用这个映射表,你可以将一个DNA序列中的碱基替换为其互补碱基。例如,如果输入的DNA序列是 "ATCG",那么输出的互补序列将是 "TAGC"。
map<char,char>mp = {{'A','T'},{'C','G'},{'T','A'},{'G','C'}};
//将字符串s1中的每个字符替换为映射表mp中对应的字符
for (int i = 0; i < n; i++) {
s1[i] = mp[s1[i]];
}
//用于比较两个字符串s1和s2的每个字符。
// 如果在某个位置上,s1和s2的字符不相等,它会尝试在s2中查找与s1[i]相等的字符,并将其与s2[i]交换。如果没有找到相等的字符,则将s1[i]赋值给s2[i]。
for (int i = 0; i < n; i++) {
if (s1[i] != s2[i]) {
int x = find(s1,s2,i,s1[i],s2[i]);//i是开始查找的位置。
if (x != -1) swap(s2[i],s2[x]);
else s2[i] = s1[i];
cnt++;
}
}
cout << cnt << '\n';
return 0;
}