公告

👇 QQ 👇---👇 微信 👇

欢迎大家私信交流

Skip to content

蓝桥题库 3904. DNA序列修正

1.DNA序列修正 - 蓝桥云课

问题描述

在生物学中,DNA 序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA 序列,每条序列由 A、C、G、T 四种字符组成,长度相同。但是现在我们记录的 DNA 序列存在错误,为了严格满足 DNA 序列的碱基互补配对即 A - T 和 C - G,我们需要依据第一条 DNA 序列对第二条 DNA 序列进行以下操作

  1. 选择第二条 DNA 序列的任意两个位置,交换他们的字符。
  2. 选择第二条 DNA 序列任意一个位置,将其字符替换为 A、C、G、T 中的任何一个。 需要注意的是:每个位置上的碱基只能被操作一次! 你的任务是通过最小的操作次数,使第二条 DNA 序列和第一条 DNA 序列互补。并且已知初始两条 DNA 序列长度均为 N。

输入格式

第一行包含一个整数 N,(1N103),表示 DNA 序列的长度。 接下来的两行,每行包含一个长度为 N 的字符串,表示两条 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,不然由于字符串元素不可变的性质,是无法得到一个可以被修改的可迭代对象的。

上次更新于: