编辑距离
题目如下:
官方题解比较啰嗦,难懂,说一下我的想法。
递推公式如下:
如果我们用 d[i][j] 表示第一个单词i个位置为止的字符串和第二个单词j个位置位置的字符串的编辑距离,那么很容易写出如下递推公式:
当word1 第i个位置和 word2第j个位置相等的时候:
d[i][j] = d[i-1][j-1],跟消消乐一样,两个直接消掉了。
不相等的时候,如果把word2固定住,想把word1变成word2,可以做如下操作:
1 替换
d[i][j] = d[i-1][j-1] + 1
2 插入
d[i][j] = d[i][j-1] + 1
3 删除
d[i][j] = d[i-1][j] + 1
把word1固定,变换word2也是这个公式,所以本质只有三种操作,所以不难写出如下代码:
class Solution(object):
def minDistance(self, word1, word2):
if (len(word1) == 0):
return len(word2)
if (len(word2) == 0):
return len(word1)
d = []
for i in range(len(word1) + 1):
l = []
for j in range(len(word2) + 1):
l.append(0)
d.append(l)
for i in range(1+len(word2)):
d[0][i] = i
for i in range(1+len(word1)):
d[i][0] = i
for i in range(1, 1+len(word1)):
for j in range(1, 1+ len(word2)):
if word1[i-1] == word2[j-1]:
d[i][j] = d[i-1][j-1]
else:
d[i][j] = min(d[i][j-1], d[i-1][j])
d[i][j] = min(d[i][j], d[i-1][j-1])
d[i][j] = d[i][j] + 1
return d[len(word1)][len(word2)]