Notas de cepillado de LeetCode _72. Editar distancia

El tema es de LeetCode

72. Editar distancia

Se puede acceder a otras soluciones o código fuente: tongji4m3

descripción

Dadas dos palabras word1 y word2, calcule el número mínimo de operaciones utilizadas para convertir word1 en word2.

Puede realizar las siguientes tres operaciones en una palabra:

Insertar un carácter
Eliminar un carácter
Reemplazar un carácter

Ejemplo 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

Ejemplo 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

Ideas

dp[i][j]代表将word1的前i-1个字符与word2的前j-1个字符转换的最小操作
返回dp[m][n]
初始化: dp[0][0]=0 dp[i][0]=i dp[0][j]=j
递推方程:
上边代表增加,左边代表删除,左上代表替换,因为可能不用替换
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(word1[i-1]==word2[j-1] ? 0:1))

detalle

  1. Preste atención a la operación de agregar uno cuando no hay coincidencia
  2. Si ahorra espacio, se puede representar mediante una matriz unidimensional, que se puede deducir de dos dimensiones. Cabe señalar que la operación de inicialización de la columna cambia durante el proceso de derivación y los detalles de usar una variable para almacenar el elemento de la esquina superior izquierda

Código

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 + 1; i++) dp[i][0] = i;
    for (int j = 0; j < n + 1; j++) dp[0][j] = j;

    for (int i = 1; i < m + 1; i++)
    {
    
    
        for (int j = 1; j < n + 1; j++)
        {
    
    
            //look,需要+1,并且注意+1的时机
            dp[i][j] = Math.min(dp[i - 1][j] + 1,
                                Math.min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + (word1.charAt(i - 1) == word2.charAt(j - 1) ? 0 : 1)));
        }
    }
    return dp[m][n];
}
//节约空间
public int minDistance(String word1, String word2)
{
    
    
    int m = word1.length(), n = word2.length();

    int[] dp = new int[n + 1];
    for (int j = 0; j < n + 1; j++) dp[j] = j;

    for (int i = 1; i < m + 1; i++)
    {
    
    
        int leftTop = dp[0];//look 记录左上角的值 注意和下面一条的顺序
        dp[0] = i;//look 不要忽略这里的初始化
        for (int j = 1; j < n + 1; j++)
        {
    
    
            int temp = dp[j];
            if (word1.charAt(i - 1) == word2.charAt(j - 1)) dp[j] = leftTop;
            else dp[j] = Math.min(dp[j], Math.min(dp[j - 1], leftTop)) + 1;
            leftTop = temp;
        }
    }
    return dp[n];
}

Análisis de complejidad

complejidad del tiempo

O (N 2) O (N ^ 2) O ( N2 )

Complejidad espacial

O (N 2) O (N ^ 2) O ( N2 )Optimización del espacio:O (N) O (N)O ( N )

Supongo que te gusta

Origin blog.csdn.net/weixin_42249196/article/details/108302317
Recomendado
Clasificación