动态规划——计算两个单词的最短距离
题目描述:
给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
- 插入一个字符
- 删除一个字符
- 替换一个字符
思路:
首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。
显然可以有如下动态规划公式:
- if i == 0 且 j == 0,edit(i, j) = 0
- if i == 0 且 j > 0,edit(i, j) = j
- if i > 0 且j == 0,edit(i, j) = i
- if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
计算edit(1, 1),edit(0, 1) + 1 == 2,edit(1, 0) + 1 == 2,edit(0, 0) + f(1, 1) == 0 + 1 == 1,min(edit(0, 1),edit(1, 0),edit(0, 0) + f(1, 1))==1,因此edit(1, 1) == 1。 依次类推:
代码实现:
# s1 = 'failing' # s2 = 'sailn' s1 = input() s2 = input() l1 = len(s1) l2 = len(s2) table = [[0 for column in range(l1+1)] for raw in range(l2+1)] for column in range(l1+1): table[0][column]=column for raw in range(l2+1): table[raw][0] = raw for raw in range(1,l2+1): for column in range(1,l1+1): c1 = table[raw-1][column]+1 c2 = table[raw][column-1]+1 if s1[column-1] == s2[raw-1]: c3 = table[raw-1][column-1] else: c3 = table[raw-1][column-1]+1 table[raw][column]=min([c1,c2,c3]) # for i in range(l2+1): # print(table[i]) print(table[-1][-1])