🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
所属专题:[比对](README.md) &emsp; ## 问题 给定两个长度相等的字符串`$ s $`和`$ t $`,它们之间的汉明距离(Hamming distance),是`$ s $`和`$ t $`对应位置上的字符不相同的个数,用`$ d_H(s,t) $`表示。见下图:(图片来源:[ROSALIND](http://rosalind.info/media/problems/hamm/)) ***** <div align="center"><img src="http://rosalind.info/media/problems/hamm/Hamming_distance.png"></div> <div align="center">图中所示的两条序列间的汉明距离为7. 不匹配的字符用红色标示。</div> ***** **输入:** 两个长度相等的DNA序列`$ s $`与`$ t $`(长度不超过1 kb)。 **输出:** 它们的汉明距离`$ d_H(s,t) $`. **样例数据:** ~~~ GAGCCTACTAACGGGAT CATCGTAATGACGGCCT ~~~ **样例输出:** ~~~ 7 ~~~ &emsp; ## 背景知识 该问题涉及“汉明距离”(Hamming distance)概念的理解与计算,它是衡量两个等长序列相似度的指标,也是适用范围更广的“编辑距离”(Editing distance)的特例。详情请查阅ROSALIND网站上[关于该问题的背景说明](http://rosalind.info/problems/hamm/)。 &emsp; ## 解答 ``` def hamming_dist(s1, s2): """计算两个等长序列s1, s2的汉明距离;若序列不等长,返回异常值-1""" if len(s1)!=len(s2): return -1 else: dh = 0 for i in range(len(s1)): if s1[i]!=s2[i]: dh += 1 return dh ## --main-- with open("rosalind_hamm.txt", 'r') as f1: dna_seqs = f1.readlines() for i in range(len(dna_seqs)): dna_seqs[i] = dna_seqs[i].strip() result = hamming_dist(dna_seqs[0], dna_seqs[1]) with open("rosalind_hamm_out.txt", 'w') as f2: if result==-1: f2.write("Error: The two given strings are in different length! No Hamming distance!") else: f2.write(str(result)) ```