我在查找此问题的算法时遇到了问题。我会粘贴问题描述以及我如何解决它,尽管它不是正确的解决方案。 它类似于编辑距离算法,我使用相同的方法,但有些东西是关闭的,我无法弄清楚到底是什么
两个字符串之间的删除距离是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。
答案 0 :(得分:2)
正如Ken Y-N先前的回答所述,其他部分应至少为3个运营成本。 这个答案的唯一变化是 - 它被改写为适应你的问题。
3项行动是:
以下应该有效 - 我猜:
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 = 1
和m[i][j] = len(s1)
或s2
,您将获得经典的Levenshtein距离。