蓝桥题库 3904. DNA序列修正
问题描述
在生物学中,DNA 序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA 序列,每条序列由 A、C、G、T 四种字符组成,长度相同。但是现在我们记录的 DNA 序列存在错误,为了严格满足 DNA 序列的碱基互补配对即 A - T 和 C - G,我们需要依据第一条 DNA 序列对第二条 DNA 序列进行以下操作:
- 选择第二条 DNA 序列的任意两个位置,交换他们的字符。
- 选择第二条 DNA 序列任意一个位置,将其字符替换为 A、C、G、T 中的任何一个。 需要注意的是:每个位置上的碱基只能被操作一次! 你的任务是通过最小的操作次数,使第二条 DNA 序列和第一条 DNA 序列互补。并且已知初始两条 DNA 序列长度均为 N。
输入格式
第一行包含一个整数 N,
,表示 DNA 序列的长度。 接下来的两行,每行包含一个长度为 的字符串,表示两条 DNA 序列。 输出格式
输出一个整数,表示让第二条 DNA 序列和第一条 DNA 序列互补所需的最小操作次数
python
import os
import sys
# 请在此输入您的代码
N=int(input())
d1=list(input())
d2=list(input())
pairs={"A":0,"T":3,"C":1,"G":2} #匹配的碱基相加value==3
ans=0
for i in range(N): #每个位置上的碱基**只能被操作一次**! 因此选择遍历一遍碱基
if pairs[d1[i]]+pairs[d2[i]]!=3: #如果同一个位置的碱基不匹配
for j in range(i+1,N): #在这个碱基之后的位置中寻找交换对象
if pairs[d1[i]]+pairs[d2[j]]==3 and pairs[d2[i]]+pairs[d1[j]]==3:
#如果在之后的位置中找到了一对儿“交叉匹配”的碱基
d2[i],d2[j]=d2[j],d2[i] #交换这一对儿碱基
break #停止遍历,因为已经找到了
ans+=1 #只要找到一组不匹配的碱基,操作次数都+1,经过交换能找到,算一次操作;遍历之后都找不到能交换的,默认换一个碱基,但是不需要体现在碱基字符串中,因为最后不需要输出结果,只需要输出次数。
print(ans)
这里的pairs字典设置的很妙:定义配对的一组碱基相加等于一个固定值。相比于{'A':'T','T':'A','G':'C','C':'G}
这种字典定义要省事儿的多,不用一一讨论了。
另外一点值得注意的是d1和d2的读取,需要读取成list
,不然由于字符串元素不可变的性质,是无法得到一个可以被修改的可迭代对象的。