计算单词之间的最小编辑距离

目录

任务描述

相关知识

编辑距离

如何求出两个字符串之间的编辑距离

编程要求

测试说明

代码展示


任务描述

本关任务:计算两个单词之间的最小编辑距离。

相关知识

为了完成本关任务,你需要掌握: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"之间的编辑距离可以利用下述方法计算。

  1. 若ai= bj,则字符串"a1a2a3…ai"和"b1b2b3…bj "之间的编辑距离等与S11="a1a2a3…a(i-1) "和 S12="b1b2b3…b(j-1) "之间的编辑距离,即为k1。
  2. 若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之间补充代码,计算两个单词之间的编辑距离。

测试说明

平台会对你编写的代码进行测试:

测试输入:horseros; 预期输出: 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 分别是两个输入字符串的长度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹤入云霄

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值