通过汉明距离查找最接近的子字符串

时间:2019-03-21 00:12:27

标签: python hamming-distance

我需要找到最接近汉明距离的字符串s的子字符串,并使其返回最接近子字符串的索引的元组,即最接近子字符串的汉明距离为{{1} },以及最接近的子字符串本身。

到目前为止,我有此代码:

p

但是我对如何解决这个问题感到困惑:

  

您的函数应该返回def ham_dist(s1, s2): if len(s1) != len(s2): raise ValueError("Undefined") return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2)) ,因为最接近的子字符串是(1,2,'bcef'),它从'bcef'中的索引1开始,并且到s的汉明距离是2。 >      

在您的函数中,应使用(a)部分中的p函数。如果有多个子字符串与ham_dist的最小距离相同,请返回其中任何一个。

2 个答案:

答案 0 :(得分:4)

您可以遍历源字符串,并计算从当前索引开始的搜索字符串与相同长度的子字符串之间的汉明距离。如果索引,汉明距离和子字符串小于以前,则保存该索引。这样,您将获得最小值。

source_string = "pGpEusuCSWEaPOJmamlFAnIBgAJGtcJaMPFTLfUfkQKXeymydQsdWCTyEFjFgbSmknAmKYFHopWceEyCSumTyAFwhrLqQXbWnXSn"
search_string = "tyraM"

def ham_dist(s1, s2):
    if len(s1) != len(s2):
        raise ValueError("Undefined")
    return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))

def search_min_dist(source,search):
    l = len(search)
    index = 0
    min_dist = l
    min_substring = source[:l]    
    for i in range(len(source)-l+1):
        d = ham_dist(search, source[i:i+l])
        if d<min_dist:
            min_dist = d
            index = i
            min_substring = source[i:i+l]  
    return (index,min_dist,min_substring)

print search_min_dist(source_string,search_string)

输出

(28, 2, 'tcJaM')

答案 1 :(得分:1)

Hugo Delahaye的答案是一个很好的答案,可以直接回答您的问题,而且做得更好,但是思考此类问题的另一种方法是让Python的min()函数找出答案。在这种data-centric programming类型下(参见规则5),您的目标是对数据进行整理以使其成为可能。

s = 'abcefgh'
p = 'cdef'
N = len(p)

substrings = [
    s[i : i + N]
    for i in range(0, len(s) - N + 1)
]

result = min(
    (ham_dist(p, sub), sub, i)
    for i, sub in enumerate(substrings)
)

print(substrings)    # ['abce', 'bcef', 'cefg', 'efgh']
print(result)        # (2, 'bcef', 1)