目录
任务描述
本关任务:计算两个单词之间的最小编辑距离。
相关知识
为了完成本关任务,你需要掌握:1.编辑距离,2.动态规划。
编辑距离
对于两个字符串S1,S2,经过d次编辑可以使得其中一个字符串变为另外一个字符串,那么我们称字符串S1和S2之间的编辑距离为d。 可用的编辑操作有以下三种。 1.替换。将某一个字母换为另外一个字母。如happa -> happy,将最后一个字母“a”替换为”y”。 2.插入。在字符串中插入一个字母。如hapy -> happy,在“p”和“y”之间插入字母“p”。 3.删除。删除字符串中的一个字母。如habppy -> happy,删除“a”和“p”之间的字母”b”。
如何求出两个字符串之间的编辑距离
对于字符串S1="a1a2a3…am ",S2="b1b2b3…bn",计算其编辑距离。 假设字符串S11="a1a2a3…a(i-1) "和 S12="b1b2b3…b(j-1) "之间的编辑距离为k1,S12="a1a2a3…ai "和S22="b1b2b3…b(j-1) "之间的编辑距离为k2,S13="a1a2a3…a(i-1) "和S23="b1b2b3…bj "之间的编辑距离为k3。则字符串"a1a2a3…ai"和"b1b2b3…bj"之间的编辑距离可以利用下述方法计算。
- 若ai= bj,则字符串"a1a2a3…ai"和"b1b2b3…bj "之间的编辑距离等与S11="a1a2a3…a(i-1) "和 S12="b1b2b3…b(j-1) "之间的编辑距离,即为k1。
- 若ai≠ bj,则有三种方式可以得到字符串"a1a2a3…ai "和"b1b2b3…bj "。
①首先将ai和bj变为相等的字符,然后再根据(1)计算编辑距离。此时字符串"a1a2a3…ai "和"b1b2b3…bj"之间的编辑距离为1+k1。 ②将字符串"b1b2b3…bj "的最后一个字母删除,然后再计算在S12="a1a2a3…ai"和S22="b1b2 b3…b(j-1) "之间的编辑距离。此时字符串"a1a2a3…ai"和"b1b2b3…bj "之间的编辑距离为1+k2 ③将字符串"a1a2a3…ai"的最后一个字母删除,然后再计算在S13="a1a2a3…a(i-1) "和S23="b1 b2b3…bj "之间的编辑距离。此时字符串"a1a2a_3…ai"和"b1b2b3…bj "之间的编辑距离为1+k3 因此当ai≠ bj时,字符串"a1a2a3…ai"和"b1b2b3…bj"之间的剪辑距离为min(k1,k2,k3 )+1.
编程要求
根据提示,在右侧编辑器的Begin和End之间补充代码,计算两个单词之间的编辑距离。
测试说明
平台会对你编写的代码进行测试:
测试输入:horse
,ros
; 预期输出: 3
开始你的任务吧,祝你成功!
代码展示
def minDistance(word1, word2):
n = len(word1)
m = len(word2)
# 有一个字符串为空串
if n * m == 0:
return n + m
# DP 数组
D = [ [0] * (m + 1+1) for _ in range(n + 1)]
# 边界状态初始化
for i in range(n + 1):
D[i][0] = i
for j in range(m + 1):
D[0][j] = j
######## Begin ########
# 状态转移过程
for i in range(1, n+1):
for j in range(1, m+1):
# 如果字符相同,不计入编辑操作,继承之前的值
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-1][j-1]) + 1
######## End ########
return D[n][m] # 取最后一个值
s1 = input()
s2 = input()
ans = minDistance(s1, s2)
print(ans)
这个算法的时间复杂度和空间复杂度都是 O(nm),其中 n 和 m 分别是两个输入字符串的长度。