Niuke He Likou de hoy == costo mínimo de edición / distancia-programación dinámica de Java-finalmente lo descubrió

Fuente: Niuke y Likou
Exención de responsabilidad: si violé los derechos de alguien, comuníquese conmigo y lo eliminaré.
Bienvenidos expertos a rociarme

Tema de Niu Ke: costo mínimo de edición

Dadas dos cadenas str1 y str2, y luego tres enteros ic, dc y rc, que representan el costo de insertar, eliminar y reemplazar un carácter, genere el costo mínimo de editar str1 a str2.

Ejemplo 1
Ingrese "abc", "adc", 5,3,2 y
devuelva el valor 2

Ejemplo 2
Ingrese "abc", "adc", 5,3,100 y
devuelva el valor 8

Programación dinámica:
dp [i] [j] representa la posición palabra1 a i se convierte en palabra2 a la posición j requiere el menor número de pasos
cuando palabra1 [i] == palabra2 [j], dp [i] [j] = dp [i-1] [j-1];
cuando palabra1 [i]! = palabra2 [j], dp [i] [j] = min (dp [i-1] [j-1], dp [i-1 ] [j], dp [i] [j-1]) + 1

La siguiente es una comprensión de la ecuación de estado, ¡muy clásica! ! !

(Fuente https://leetcode-cn.com/problems/edit-distance/solution/zi-di-xiang-shang-he-zi-ding-xiang-xia-by-powcai-3/)

讲一下我自己对状态转移方程的理解,麻烦大家看看我说得对不对有没有道理:
(一)、当word1[i]==word2[j]时,由于遍历到了i和j,说明word1的0~i-1和word2的0~j-1的匹配结果已经生成,
由于当前两个字符相同,因此无需做任何操作,dp[i][j]=dp[i-1][j-1]
(二)、当word1[i]!=word2[j]时,可以进行的操作有3个:
     ① 替换操作:可能word1的0~i-1位置与word2的0~j-1位置的字符都相同,
           只是当前位置的字符不匹配,进行替换操作后两者变得相同,
           所以此时dp[i][j]=dp[i-1][j-1]+1(这个加1代表执行替换操作)
      ②删除操作:若此时word1的0~i-1位置与word2的0~j位置已经匹配了,
         此时多出了word1的i位置字符,应把它删除掉,才能使此时word1的0~i(这个i是执行了删除操作后新的i)
         和word2的0~j位置匹配,因此此时dp[i][j]=dp[i-1][j]+1(这个加1代表执行删除操作)
      ③插入操作:若此时word1的0~i位置只是和word2的0~j-1位置匹配,
          此时只需要在原来的i位置后面插入一个和word2的j位置相同的字符使得
          此时的word1的0~i(这个i是执行了插入操作后新的i)和word2的0~j匹配得上,
          所以此时dp[i][j]=dp[i][j-1]+1(这个加1代表执行插入操作)
      ④由于题目所要求的是要最少的操作数:所以当word1[i] != word2[j] 时,
          需要在这三个操作中选取一个最小的值赋格当前的dp[i][j]
(三)总结:状态方程为:
if(word1[i] == word2[j]):  dp[i][j] = dp[i-1][j-1]
else:  min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1  
PS:大佬的代码中word1.charAt(i-1)==word2.charAt(j-1)的原因是:
     初始化DP Table时dp[i][0]和dp[0][j]已经填写完成,所以接下来填表需要从1开始,
     但是字符的比较需要从0开始,因此才这样子写
Código
import java.util.*; 
public class Solution {
    
    
    /**
     * min edit cost
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @param ic int整型 insert cost
     * @param dc int整型 delete cost
     * @param rc int整型 replace cost
     * @return int整型
     */
    public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
    
    
        int m = str1.length();
        int n = str2.length();
        int[][] dp = new int[m+1][n+1];
        for (int i = 1; i <= m; i++) {
    
    
            dp[i][0] = i*dc;
        }
        for (int i = 1; i <= n; i++) {
    
    
            dp[0][i] = i*ic;
        }
        for (int i = 1; i <= m; i++) {
    
    
            for (int j = 1; j <= n; j++) {
    
    
                if (str1.charAt(i-1) == str2.charAt(j-1)) {
    
    
                    dp[i][j] = dp[i-1][j-1];
                } else {
    
    
                    int insert = dp[i][j-1] + ic;
                    int delete = dp[i-1][j] + dc;
                    int replace = dp[i-1][j-1] + rc;
                    dp[i][j] = Math.min(insert, Math.min(delete, replace));
                }
            }
        }
        return dp[m][n];
    }
}
leetcode title: 72. Editar distancia

Enlace: https://leetcode-cn.com/problems/edit-distance

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:
Entrada: palabra1 = "caballo", palabra2 = "ros"
Salida: 3
Explicación:
caballo -> rorse (reemplaza'h '
con'r ') rorse -> rose (delete'r ')
rose -> ros ( Delete'e ')

Ejemplo 2:
Entrada: palabra1 = “intención”, palabra2 = “ejecución”
Salida: 5
Explicación:
intención -> inention (delete't ')
inention -> enention (
reemplazar'i ' con'e ') enention -> exention (
Reemplazar'n ' con'x ') exentión -> ejecución (Reemplazar'n ' con'c')
ejecución -> ejecución ( insertar'u ')

La idea es la misma que la anterior, es decir, todos los costos se cambian a 1

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int[][] dp = new int[m+1][n+1];
        for (int i = 1; i <= m; i++) {
            dp[i][0] = i;
        }
        for (int i = 1; i <= n; i++) {
            dp[0][i] = i;
        }
        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 {
                    int insert = dp[i][j-1] + 1;
                    int delete = dp[i-1][j] + 1;
                    int replace = dp[i-1][j-1] + 1;
                    dp[i][j] = Math.min(insert, Math.min(delete, replace));
                }
            }
        }
        return dp[m][n];
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45531729/article/details/110953959
Recomendado
Clasificación