题解 | #计算字符串的编辑距离#
计算字符串的编辑距离
https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314
//两个字符串最短编辑距离 //这道题确实比较难, 注意是状态不知道怎么确定, //dp[i][j] 字符串a 的前i个字符 和字符串b 的前j个字符所需的最短编辑距离, // 当 a[i-1] == b[j-1]时, dp[i][j] = dp[i-1][j-1] // 否则 dp[i][j] = min( dp[i-1][j-1]+1 ,dp[i-1][j]+1 ,dp[i][j-1]+1 ) // 替换 插入 删除 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String a= sc.nextLine(); String b = sc.nextLine(); //定义dp数组, 表示a的前i个字符, 和b的前j的字符 相同所需的编辑距离 int [][]dp = new int[a.length()+1][b.length()+1]; //初始化dp数组, 任意一个字符串为空时, 需要的操作次数是另一个字符串的长度 for (int i = 0; i <= b.length(); i++) { dp[0][i] = i; } for (int i = 0; i <= a.length(); i++) { dp[i][0] = i; } //给dp数组赋值 //dp[i][j] = min( dp[i-1][j-1]+1 ,dp[i-1][j]+1 ,dp[i][j-1]+1 ) 需要操作 // 替换 插入 删除 //当 a[i]==b[j] 时, dp[i][j] = dp[i-1][j-1] 不需要操作 //从左到右, 从上到下遍历 for (int i = 1; i <= a.length(); i++) { for (int j = 1; j <= b.length(); 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-1][j-1]+1 , Math.min( dp[i-1][j]+1 ,dp[i][j-1]+1 ) ); } } } System.out.println( dp[a.length()][b.length()] ); } }