import java.util.Scanner; /** * 解题思路: * 首先对于修改字符串子类的题,第一时间应该想到动态规划 * 首先我们假定是将 A 编辑为 B * 因此要将 A[0,...i-1] 编辑为 B[0,...j-1] 有如下两种情况 * 1. A[i-1] == B[j-1] * 显而易见 A[0,...i-1] 编辑为 B[0,...j-1] == A[0,...i-2] 编辑为 B[0,...j-2] * 2. A[i-1] != B[j-1] (这个情况下又分为三种情况) * (1)插入: A[0,...i-1] 编辑为 B[0,...j-2], 再插入 B[j-1] * (2)删除: A[0,...i-2] 编辑为 B[0,...j-1], 再删除 A[i-1] * (3)修改: A[0,...i-2] 编辑为 B[0,...j-2], 再将 A[i-1] 修改为 B[j-1] */ public class Main { /** * 根据上面的解题思路,我们有如下定义 * 状态定义: dp[i][j] 为 A 的前 i-1 个字符转换为 B 的前 j-1 个字符的最小编辑距离 * 转移方程: * 当 A[i-1] == B[j-1]: dp[i][j] = dp[i-1][j-1] * 当 A[i-1] != B[j-1]: dp[i][j] = min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1]) + 1 * 初始值: 初始化 dp 的第一行和第一列 * 返回值: 返回 dp[i][j] 即可 * @param args */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String A = scanner.nextLine(); String B = scanner.nextLine(); int lenA = A.length(); int lenB = B.length(); //状态数组 int[][] dp = new int[lenA+1][lenB+1]; //初始化 for (int i = 0; i <= lenA; i++) { dp[i][0] = i; } for (int i = 0; i <= lenB; i++) { dp[0][i] = i; } //状态转移 for (int i = 1; i <= lenA; i++) { for (int j = 1; j <= lenB; j++) { if (A.charAt(i-1) == B.charAt(j-1)) { dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j],dp[i-1][j-1])) + 1; } } } System.out.println(dp[lenA][lenB]); } } }