解题思路:
- 考虑俩种情况
- 一种是:俩个字符串的对应位置相同
- 相同 则不需要变
- 一种是:俩个字符串的对应位置不同
- 不同包含三种类型的操作, 因为dp[i][j] 分表代表的是 i-1的第一个单词和j-1的第二个单词 做对比, 所得到的做小操作次数,
- 所以当对其中某个字符串进行删除操作, 相当于对应减去i或者j 即 dp[i - 1][j] 和dp[i][j - 1]
- 而替换的话, 相当于之前都相同,再增加一次替换操作。
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String word1 = in.next();
String word2 = in.next();
// 以word1 的i-1位置和 word2 的 j-1的位置,相比较 需要的最少编辑次数
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
// 初始化
for (int i = 0; i <= word1.length(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.length(); j++) dp[0][j] = j;
// 赋值
for (int i = 1; i <= word1.length(); i++) {
for (int j = 1; j <= word2.length(); j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
// 和上一个相同 不需要变
dp[i][j] = dp[i - 1][j - 1];
} else {
// 需要进行 删除word1 / 删除word2/ 替换 其中一个, 求最小的
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
}
}
System.out.println(dp[word1.length()][word2.length()]);
}
}
}