import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str1 string字符串
* @param str2 string字符串
* @return int整型
*/
public int editDistance (String str1, String str2) {
// write code here
if (str1 == null || str2 == null) {
return 0;
}
int m = str1.length();
int n = str2.length();
//dp[i][j] 代表 str1[0,i-1] 改成 str2[0,j-1] 的最少操作数
int[][] dp = new int[m + 1][n + 1];
//dp[0][0] 代表 str[0, 0-1] 到 str2[0, 0-1]
for (int i = 1 ; i <= m ; i++) {
//删除元素
dp[i][0] = i;
}
for (int j = 1 ; j <= n; j++) {
//添加元素
dp[0][j] = j;
}
for (int i = 1; i <= m; i ++) {
for (int j = 1; j <= n; j ++) {
int temp1 = 0, temp2 = 0, result;
//求dp[i][j] str[0, i-1] 转为 str2[j-1]
//1.str1[0,i-1] 编辑成str2[j-2],然后再str2[j-1] dp[i][j-1] + 1
//2.str1[0,i-1]编辑成str1[i-2]然后再变成求解 str1[i-2]编辑成str2[j - 1] dp[i-1][j] + 1
//其实就是矩阵中, [i][j]位置的左边、 上边、斜左边,怎么变成dp[i][j]
temp1 = Math.min(dp[i][j-1] + 1 , dp[i-1][j] +1);
//处理斜边
if(str1.charAt(i-1) == str2.charAt(j-1)){
temp2 = dp[i-1][j-1];
}else{
//str1[0, i - 2] 编辑成 str2[j-2]基础上,加一个 str2[j-1]字符
temp2 = dp[i-1][j-1] + 1;
}
result = Math.min(temp1, temp2);
dp[i][j] = result;
}
}
return dp[m][n];
}
}