蓝桥OJ:DNA序列修正—>使用map来解决

###分析
####什么时候需要操作1?
ACGTG
ACGTC
(需要进行2次操作1)
第一条的某个位置和第二条的对应位置为不互补字母(比如A-A),且在后面某个位置第一条的某个位置和第二条的某个位置也为相同字母,且该字母与前某位置的字母互补(比如T-T)

####初步思路:
若字符串up中的i位置与字符串down中的j位置匹配,且字符串up的j位置与字符串的i位置匹配,执行down的i,j位置交换,操作数加1.

####什么时候需要操作2?
(1)不满足操作1的情况下:
AGC
GAG
(需要进行2次操作2)

(2)操作1完成后仍无法完全匹配的情况下:
ACGTG
ACGTT
(需要2次操作1,还需要1次操作2)

####满足(1)(2)的分析思路:
原来的操作数的基础之上再加上无法匹配的位置的个数

在这里插入图片描述
在这里插入图片描述
代码如下:
‘’‘
#include<bits/stdc++.h>
using namespace std;
map<char,int>DNA={{‘A’,0},{‘C’,1},{‘G’,2},{‘T’,3}};//key唯一 0+3=3,1+2=3判断互补
int main()
{
int n,operations=0;
cin>>n;
string up,down;
cin>>up>>down;//没有空格输入,可以不用getline(cin>>up);
for(int i=0;i<n;++i)
{
//先判断,参考样例A与T
if(DNA[up[i]]+DNA[down[i]]!=3)//如果两条序列某位置不互补
{
for(int j=i+1;j<n;++j)
{
if(DNA[up[i]]+DNA[down[j]]==3&&DNA[up[j]]+DNA[down[i]]==3)
{
swap(down[i],down[j]);//交换第二条序列中的碱基,完成配对
operations++;//这里计数只单纯计下了操作1的数量
break;//跳出内部for循环,i移为下一个,j从i的下一个重新开始遍历第二条序列
}
}
}
}
//序列可能存在不满足操作1的情况,或者执行操作1后序列仍然存在不互补的
for(int i=0;i<n;++i)
{
if(DNA[up[i]]+DNA[down[i]]!=3)
{
operations++;
}
}
cout<<operations<<endl;
return 0;
}
’‘’

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值