Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个小问题:汉明距离。
提问
计算两条 DNA 链之间的汉明距离。
你的身体由含有 DNA的细胞组成。这些细胞会定期磨损并需要更换,它们通过分裂成子细胞来实现这一过程。事实上,普通人的身体在一生中会经历大约 10000 万亿次细胞分裂!
当细胞分裂时,它们的 DNA 也会复制。有时在这个过程中会出现错误,单条 DNA 会被编码上错误的信息。如果我们比较两条 DNA 链并计算它们之间的差异,我们就能看到发生了多少错误。这被称为“汉明距离”。
我们用字母 C、A、G 和 T 读取 DNA。两条链可能看起来像这样:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
它们有 7 处不同,因此汉明距离为 7。
汉明距离在科学的很多领域都很有用,不仅仅是在生物学中,所以熟悉这个术语是很不错的。
注意:
汉明距离仅对长度相等的序列有定义,因此尝试在长度不同的序列之间计算它是不可行的。
模板:
pub fn hamming_distance(s1: &str, s2: &str) -> Option<usize> {}
分析
我们将两个字符串拆成char数组,然后遍历比较每个char是否相同即可,如果不同,则距离加 1 。
注意,如果两个char数组长度不一样,则直接返回None。
解决方案
pub fn hamming_distance(s1: &str, s2: &str) -> Option<usize> {
if s1.len() != s2.len() {
return None;
}
Some(s1.chars().zip(s2.chars()).fold(0,|mut acc,pair|{
if pair.0 != pair.1 {
acc += 1
}
acc
}))
}
Trick
- 使用
zip合并两个迭代器。 - 通过
fold,对合并后的迭代器进行累加处理。如果不同,返回 +1 后的累加数;如果相同,则直接返回当前的累加数。