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