import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine().trim();
        String t = in.nextLine().trim();
        int m = s.length();
        int n = t.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 (s.charAt(i - 1) == t.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    int replace = dp[i - 1][j - 1] + 1;
                    int insert = dp[i][j - 1] + 1;
                    int delete = dp[i - 1][j] + 1;
                    dp[i][j] = Math.min(replace, Math.min(insert, delete));
                }
            }
        }

        System.out.println(dp[m][n]);
    }
}

https://www.nowcoder.com/discuss/727521113110073344

思路:

  1. 输入处理:读取两个字符串s和t,并去除前后空格。
  2. 初始化动态规划数组:二维数组dp的大小为(m+1) x (n+1),其中m和n分别为两个字符串的长度。
  3. 填充初始值:处理边缘情况,当其中一个字符串为空时,编辑距离即为另一个字符串的长度。
  4. 状态转移计算:遍历每个字符位置,根据字符是否相等来更新dp数组的值,最终得到两个字符串的编辑距离。