删除2个字符串之间的距离

时间:2017-06-12 01:03:36

标签: python algorithm

我在查找此问题的算法时遇到了问题。我会粘贴问题描述以及我如何解决它,尽管它不是正确的解决方案。 它类似于编辑距离算法,我使用相同的方法,但有些东西是关闭的,我无法弄清楚到底是什么

  

两个字符串之间的删除距离是ASCII的最小总和   您需要在两个字符串中删除的字符值   为了拥有相同的字符串。 cat和。之间的删除距离   at是99,因为你可以删除cat和的第一个字符   ' c'的ASCII值是99.猫与猫之间的删除距离   bat是98 + 99,因为你需要删除两者的第一个字符   话。当然,两个字符串之间的删除距离不可能   大于它们的总ASCII值的总和,因为你可以   总是只是完全删除两个字符串。实施一个   有效的功能,找到两者之间的删除距离   你可以参考关于算法的维基百科文章   如果你愿意,可以编辑距离。那里的算法并不完全   与此处所需的算法相同,但它类似。

这是我的代码。我使用了动态编程方法。 我会说最后一行" else"需要改变,但随时纠正任何错误

def delete_distance(s1, s2):
    m = [[0 for j in range(len(s2)+1)] for i in range(len(s1)+1)]
    for i in range(len(s1)+1):
        for j in range(len(s2)+1):
            if i == 0:
                m[i][j] = sum(bytearray(s2[:j]))
            elif j == 0:
                m[i][j] = sum(bytearray(s1[:i]))
            elif s1[i-1] == s2[j-1]:
                m[i][j] = m[i-1][j-1]
            else:
                m[i][j] = ord(s1[i-1]) + ord(s2[j-1]) + min(m[i-1][j-1], m[i-1][j], m[i][j-1])
    return m[len(s1)][len(s2)]

我知道这是错误的,因为delete_distance(' cat',' cbat')的输出是197,正确的结果应该是98,因为我们只需要删除ASCII值为98的b。

2 个答案:

答案 0 :(得分:2)

正如Ken Y-N先前的回答所述,其他部分应至少为3个运营成本。 这个答案的唯一变化是 - 它被改写为适应你的问题。

3项行动是:

  • S1删除
  • S2删除
  • S1& S2删除

以下应该有效 - 我猜:

def delete_distance(s1, s2):
    m = [[0 for j in range(len(s2)+1)] for i in range(len(s1)+1)]
    for i in range(len(s1)+1):
        for j in range(len(s2)+1):
            if i == 0:
                m[i][j] = sum(bytearray(s2[:j]))
            elif j == 0:
                m[i][j] = sum(bytearray(s1[:i]))
            elif s1[i-1] == s2[j-1]:
                m[i][j] = m[i-1][j-1]
            else:
                s1del = ord(s1[i-1])
                s2del = ord(s2[j-1])
                s1s2del = s1del + s2del
                m[i][j] = min(m[i-1][j-1] + s1s2del, m[i-1][j] + s1del, m[i][j-1] + s2del)
    return m[len(s1)][len(s2)]

希望它有所帮助!

答案 1 :(得分:1)

查看relevant Wiki page,我发现最后else:应该是目前距离加上插入/删除/替换费用的最小距离。因此,使用中间值重做该术语以希望更好地说明这一点,我们得到:

else:
    wdel = ord(s1[i-1])
    wins = ord(s2[j-1])
    wsub = wdel + wins
    m[i][j] = min(m[i-1][j-1] + wsub, m[i-1][j] + wdel, m[i][j-1] + wins)

注意,如果您使用wdel = wins = wsub = 1m[i][j] = len(s1)s2,您将获得经典的Levenshtein距离。