目录
- [1- 思路](#1- 思路)
- [2- 实现](#2- 实现)
-
- [⭐++72. 编辑距离++------题解思路](#⭐72. 编辑距离——题解思路)
- [3- ACM 实现](#3- ACM 实现)
- 原题链接:72. 编辑距离
1- 思路
题目识别
- 识别1 :两个字符串之间相互转换,增、删、替换 最少的操作次数
动规五部曲
- 1- 定义 dp 数组
dp[i][j]
代表,长度为i-1
的nums1
和长度为j-1
的nums2
的编辑距离,也就是使二者相等的最小操作次数
- 2- 递推公式
- 如果两个字符相同了
dp[i][j] = dp[i-1][j-1]
,因为相同所以不需要任何操作 - 否则
- 删除 word1 操作:
dp[i-1][j] + 1
- 删除 word2 操作:
dp[i][j-1] + 1
- 替换操作:
dp[i-1][j-1] + 1
- 删除 word1 操作:
- 因此
dp[i][j] = Math.min(dp[i-1][j] + 1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+1);
- 如果两个字符相同了
- 3- 初始化
- 第一行、第一列初始化为对应的下标。
i
从1
遍历到len1
比如dp[i][0]
则初始化为i
- 4- 递推
- 由于
[i][j]
根据[i-1][j-1]
来,所以从上到下,从左到右遍历
- 由于
2- 实现
⭐++72. 编辑距离++------题解思路
java
public int minDistance(String word1, String word2) {
// 1. 定义dp数组
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
// 2.递推公式
// 相等 dp[i][j] = dp[i-1][j-1];
// 不相等 dp[i][j] = Math.min(dp[i-1]+1,dp[i-1][j-1]+1);
// 3.初始化
for (int i = 0; i <= word1.length(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= word2.length(); j++) {
dp[0][j] = j;
}
// 4.遍历
for (int i = 1; i <= word1.length(); i++) {
for (int j = 1; j <= word2.length(); j++) {
if (word2.charAt(j - 1) == word1.charAt(i - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i - 1][j] + 1, Math.min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));
}
}
}
return dp[word1.length()][word2.length()];
}
3- ACM 实现
java
public class minDistance {
public static int minDistance(String word1,String word2){
// 1.定义dp
// dp[i][j] 代表 以 i-1 和 j-1 为结尾的 word1 和 word2 的编辑距离
int len1 = word1.length();
int len2 = word2.length();
int[][] dp = new int[len1+1][len2+1];
// 2.递推公式
// 相等的话 dp[i][j] = dp[i-1][j-1]
// 不相等 删除两种 dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1
// 3.初始化
//
for(int i = 1 ; i <= len1 ;i++){
dp[i][0] = i;
}
for(int i = 1 ; i <= len2;i++){
dp[0][i] = i;
}
for(int i = 1 ; i <= len1;i++){
for(int j = 1 ; j <= len2;j++){
if(word1.charAt(i-1) == word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1];
}else{
dp[i][j] = Math.min(dp[i-1][j]+1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+1));
}
}
}
return dp[len1][len2];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String word1 = sc.nextLine();
String word2 = sc.nextLine();
System.out.println("结果是"+minDistance(word1,word2));
}
}