📜  编辑距离 | DP-5(1)

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

编辑距离 | DP-5

简介

编辑距离(Edit Distance)是指两个字符串间,由一个转成另一个所需的最少编辑操作次数。这里的编辑操作可以是插入、删除、替换三种操作之一。例如,将“kitten”转换为“sitting”需要进行三次修改操作,因此,它们之间的编辑距离为3。

动态规划是解决编辑距离问题的一种经典方法。我们可以用一个二维数组来存储每个子问题的最优解,以便将它们组合成原问题的最优解。该算法的运行时间为$O(mn)$,其中$m$和$n$分别是两个字符串的长度。

状态转移方程

设$dp(i,j)$为将第一个字符串的前$i$个字符转换为第二个字符串的前$j$个字符所需要的最少编辑操作次数。则存在以下状态转移方程:

$$dp(i,j)=\begin{cases}0, & i=0,j=0\i, & j=0\j, & i=0\dp(i-1,j-1), & s1_i=s2_j\1+\min(dp(i-1,j),dp(i,j-1),dp(i-1,j-1)), & otherwise\end{cases}$$

代码实现

以下是基于状态转移方程的JAVA实现:

public int minDistance(String word1, String word2) {
    int m = word1.length(), n = word2.length();
    int[][] dp = new int[m + 1][n + 1];
    for (int i = 0; i <= m; i++) {
        dp[i][0] = i;
    }
    for (int j = 0; j <= n; j++) {
        dp[0][j] = j;
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                dp[i][j] = dp[i - 1][j - 1];
            } else {
                dp[i][j] = 1 + Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1]));
            }
        }
    }
    return dp[m][n];
}
参考文献
  1. https://en.wikipedia.org/wiki/Edit_distance
  2. https://leetcode-cn.com/problems/edit-distance/