动态规划题解 | #计算字符串的编辑距离#
计算字符串的编辑距离
https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314
一开始都想到动态规划,但是想的是一维,看了别人的想法才恍然大悟
dp[i][j]代表 l1 的前 i 个字符 与 l2 的前 j 个字符的最小编辑距离
字符串的编辑距离无关方向
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String l1 = in.nextLine();
String l2 = in.nextLine();
boolean isL1Min = l1.length() <= l2.length();
int minLength = isL1Min?l1.length():l2.length();
int[][] dp = new int[l1.length()+1][l2.length()+1];
//初始化边界值,0个字符和任意i字符的编辑距离都是i。
for(int i=1;i<=l2.length();i++) dp[0][i] = i;
for(int i=1;i<=l1.length();i++) dp[i][0] = i;
//字符相同直接继承,不相同便是三种情况,(增(删)字符串1,增(删)字符串2,直接替换)
for(int i=1;i<=l1.length();i++){
for(int j=1;j<=l2.length();j++)
if(l1.charAt(i-1)==l2.charAt(j-1)) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = Math.min(Math.min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
}
System.out.print(dp[l1.length()][l2.length()]);
}
}

查看9道真题和解析