第十三天(《LeetCode一天一例》-----两个字符串之间的最小编辑距离(python实现))
最小编辑距离定义
【第十三天(《LeetCode一天一例》-----两个字符串之间的最小编辑距离(python实现))】将一个字符串变成另外一个字符串所用的最少操作数,每次只能增加、删除或者替换一个字符。
例1:输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (replace 'h' with 'r')
rorse -> rose (remove 'r')
rose -> ros (remove 'e')
例2:
输入: word1 = "intention", word2 = "execution"
输出: 5
解释:
intention -> inention (remove 't')
inention -> enention (replace 'i' with 'e')
enention -> exention (replace 'n' with 'x')
exention -> exection (replace 'n' with 'c')
exection -> execution (insert 'u')
例子引出算法
我们有两个词汇,word1为michaelab , word2 为 michaelxy。 (这里我们为了比较容易理解,使用word1和word2的长度假定相等。) dp [i] [j] 作为word1转换为word2的最小编辑距离,我们就是要计算这个矩阵。
显然如果b==y, 那么dis[i][j] = dis[i-1][j-1]也就是从后面看起,如果两个字符串的最后一个字符相同,那我们就看dis[i-1][j-1]。
假设word1[i]和word2[j](此处i = j)分别为:michaelab和michaelxy我们规定三种操作:添加,删除,替换
如果b!=y,那么:
添加:也就是在michaelab后面添加一个y,那么word1就变成了michaelaby,此时
dis[i][j] = 1 + dis[i][j-1];
上式中,1代表刚刚的添加操作,添加操作后,word1变成michaelaby,word2为michaelxy。dis[i][j-1]代表从word[i]转换成word[j-1]的最小Edit Distance,也就是michaelab转换成michaelx的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaelab变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i][j-1]。
删除:也就是将michaelab后面的b删除,那么word1就变成了michaela,此时
dis[i][j] = 1 + dis[i-1][j];
上式中,1代表刚刚的删除操作,删除操作后,word1变成michaela,word2为michaelxy。dis[i-1][j]代表从word[i-1]转换成word[j]的最小Edit Distance,也就是michaela转换成michaelxy的最小Edit Distance,所以只需要将michaela变成michaelxy就可以了,而他们之间的最小Edit Distance就是dis[i-1][j]。
替换:也就是将michaelab后面的b替换成y,那么word1就变成了michaelay,此时
dis[i][j] = 1 + dis[i-1][j-1];
上式中,1代表刚刚的替换操作,替换操作后,word1变成michaelay,word2为michaelxy。dis[i-1][j-1]代表从word[i-1]转换成word[j-1]的最小Edit Distance,也即是michaelay转换成michaelxy的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaela变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i-1][j-1]。
python代码实现
def minDist(word1, word2):
len1 = len(word1)
len2 = len(word2)
dp = [[0 for i in range(len1+1)] for j in range(len2+1)]
print(dp)# 构造dp矩阵
i = 0
for item in dp:
item[0] = i
i += 1
i = 0
for i in range(len1+1):
dp[0][i] = i
i += 1 for i in range(1, len1+1):
for j in range(1, len2+1):
if word1[i-1] == word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
insert = 1 + dp[i][j-1]
delete = 1 + dp[i-1][j]
replace = dp[i-1][j-1] + 1
dp[i][j] = min(insert, delete, replace)
return dpif __name__ == '__main__':
word1 = 'daaqerdwq'
word2 = 'aswdreqew'
dp = minDist(word1, word2)
for i in dp:
print(i)
输出结果:
文章图片
可以看出 最右下角元素为2所以最小编辑距离为2
图太难画了,,我真的不想画
推荐阅读
- 慢慢的美丽
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 《跨界歌手》:亲情永远比爱情更有泪点
- 诗歌:|诗歌: 《让我们举起世界杯,干了!》
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 人间词话的智慧
- 《一代诗人》37期,生活,江南j,拨动心潭的一泓秋水
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术