我有困难理解这个问题的算法。我将粘贴问题描述和我的求解方法,尽管它不是正确的解决方案。这类似于编辑距离算法,我使用了相同的方法,但有些不对劲,我无法确定确切的原因。
两个字符串之间的删除距离是你需要在这两个字符串中删除的字符的ASCII值的最小总和,以便得到相同的字符串。cat和at之间的删除距离为99,因为你只需删除cat的第一个字符,并且'c'的ASCII值为99。cat和bat之间的删除距离为98 + 99,因为你需要删除两个单词的第一个字符。当然,两个字符串之间的删除距离不能大于它们的总ASCII值之和,因为你可以完全删除这两个字符串。实现一个高效的函数来查找两个字符串之间的删除距离。如果需要,您可以参考维基百科上关于编辑距离算法的文章,那里的算法与此处所需的算法不完全相同,但很相似。
这是我的代码。我使用了动态规划的方法。我认为最后一个“else”后面的一行需要更改,但请随意纠正任何错误。
两个字符串之间的删除距离是你需要在这两个字符串中删除的字符的ASCII值的最小总和,以便得到相同的字符串。cat和at之间的删除距离为99,因为你只需删除cat的第一个字符,并且'c'的ASCII值为99。cat和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。