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];

    }
}