Python-77:古生物DNA序列血缘分析
问题描述
小U是一位古生物学家,正在研究不同物种之间的血缘关系。为了分析两种古生物的血缘远近,她需要比较它们的DNA序列。DNA由四种核苷酸A、C、G、T组成,并且可能通过三种方式发生变异:添加一个核苷酸、删除一个核苷酸或替换一个核苷酸。小U认为两条DNA序列之间的最小变异次数可以反映它们之间的血缘关系:变异次数越少,血缘关系越近。
你的任务是编写一个算法,帮助小U计算两条DNA序列之间所需的最小变异次数。
dna1
: 第一条DNA序列。dna2
: 第二条DNA序列。
代码
def solution(dna1, dna2):
# Please write your code here
n = len(dna1)
m = len(dna2)
if n * m == 0:
return n + m
f = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(n + 1):
f[i][0] = i
for j in range(m + 1):
f[0][j] = j
for i in range(1, n + 1):
for j in range(1, m + 1):
f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1, f[i - 1][j - 1] + (dna1[i - 1] != dna2[j - 1]))
return f[n][m]
if __name__ == "__main__":
# You can add more test cases here
print(solution("AGT", "AGCT") == 1)
print(solution("", "ACGT") == 4)
print(solution("GCTAGCAT", "ACGT") == 5)