第十三天:《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 dp


if __name__ == '__main__':
	word1 = 'daaqerdwq'
	word2 = 'aswdreqew'
	dp = minDist(word1, word2)
	for i in dp:
		print(i)

输出结果:

 可以看出 最右下角元素为2  所以最小编辑距离为2

  图太难画了,,我真的不想画

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

传道解惑也

打赏一下咯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值