简介
可以对一个字符串进行三种操作:插入一个字符,删除一个字符,替换一个字符,给你两个字符串s1和s2,请计算将s1转换成s2最少需要多少次操作。
代码
import static java.lang.System.out;
public class Helloworld {
public static int minDistance(String s1, String s2){
int m = s1.length(), n = s2.length();
// 定义dp数组,其中dp[m][n]表示s1[0: m-1]和s2[0: n-1]的最小编辑距离
int[][] dp = new int[m + 1][n + 1];
// 初始化dp数组
for (int i = 1; i <= m; i++) {
// 下标0表示空串
dp[i][0] = i;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j;
}
// 填写dp表
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (s1.charAt(i - 1) == s2.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][j - 1] + 1, dp[i - 1][j]) + 1);
}
}
return dp[m][n];
}
public static void main(String[] args){
String s1 = "intention";
String s2 = "execution";
int res = minDistance(s1, s2);
out.println(res);
}
}
可记录路径版
import java.util.Scanner;
import static java.lang.System.out;
public class Helloworld {
static class Node{
public int val;
public int choice; // 0-skip,1-insert,2-delete,3-replace
Node(int val, int choice){
this.val = val;
this.choice = choice;
}
}
public static int minDistance(String s1, String s2){
int m = s1.length(), n = s2.length();
Node[][] dp = new Node[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
dp[i][0] = new Node(i, 2);
}
for (int j = 1; j <= n; j++) {
dp[0][j] = new Node(j, 1);
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (s1.charAt(i - 1) == s2.charAt(j - 1))
dp[i][j] = new Node(dp[i - 1][j - 1].val, 0);
else
{
dp[i][j] = minNode(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]);
dp[i][j].val++;
}
}
}
return dp[m][n].val;
}
public static Node minNode(Node n_insert, Node n_delete, Node n_replace){
Node res = new Node(n_insert.val, 1);
if (res.val > n_delete.val){
res.val = n_delete.val;
res.choice = 2;
}
if (res.val > n_replace.val){
res.val = n_replace.val;
res.choice = 3;
}
return res;
}
public static void main(String[] args){
// String s1 = "intention";
// String s2 = "execution";
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
out.println(s1);
out.println(s2);
int res = minDistance(s1, s2);
out.println(res);
}
}