📜  门|门CS 2008 |第 85 题(1)

📅  最后修改于: 2023-12-03 15:42:22.348000             🧑  作者: Mango

门|门CS 2008 |第 85 题

这是一道关于编辑距离的算法题目,可以考察程序员对于动态规划的理解和应用。

题目描述

给定两个字符串S和T,求将S转化为T的最小编辑距离。允许的编辑操作包括:

  1. 插入一个字符
  2. 删除一个字符
  3. 修改一个字符
示例

输入:

S = "horse"
T = "ros"

输出:

3

解释:

将S转化为T的最小编辑距离为3,可以通过以下方式实现:

1. 将'h'修改为'r'
2. 删除'r'
3. 删除'e'
题解

这道题可以使用动态规划的思想解决。我们用dp[i][j]表示将字符串S的前i个字符转化为字符串T的前j个字符所需要的最小编辑距离。则当i=0或j=0时,dp[i][j]的值即为i或j,因为此时S或T为空字符串,需要插入或删除相应数量的字符才能得到目标字符串。

当i,j均不为0时,有三种情况:

  1. 如果S[i]和T[j]相等,那么dp[i][j]的值就等于dp[i-1][j-1],因为不需要进行任何编辑操作。
  2. 如果S[i]和T[j]不相等,那么我们可以尝试三种编辑操作,即插入、删除、修改。插入操作相当于将T的第j个字符插入到S中,此时dp[i][j]就等于dp[i][j-1]+1。删除操作相当于将S的第i个字符删除,此时dp[i][j]就等于dp[i-1][j]+1。修改操作相当于将S的第i个字符修改为T的第j个字符,此时dp[i][j]就等于dp[i-1][j-1]+1。因此dp[i][j]的值就等于这三种操作中最小的那个值。
  3. 最后,我们输出dp[n][m],即将S的前n个字符转化为T的前m个字符所需要的最小编辑距离。

时间复杂度:$O(n^2)$

代码实现(Python):

def min_edit_distance(S, T):
    n, m = len(S), len(T)
    dp = [[0] * (m+1) for _ in range(n+1)]
    for i in range(n+1):
        dp[i][0] = i
    for j in range(m+1):
        dp[0][j] = j
    
    for i in range(1, n+1):
        for j in range(1, m+1):
            if S[i-1] == T[j-1]:
                dp[i][j] = dp[i-1][j-1]
            else:
                dp[i][j] = min(dp[i][j-1]+1, dp[i-1][j]+1, dp[i-1][j-1]+1)
    
    return dp[n][m]