import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str1 string字符串 
     * @param str2 string字符串 
     * @return int整型
     */
    public int editDistance (String str1, String str2) {
        if(str1 == null || str1.length() == 0)
            return str2 == null ? 0 : str2.length() ;
        if(str2 == null || str2.length() == 0) 
            return str1 == null ? 0 : str1.length() ;
        int len1 = str1.length() ;
        int len2 = str2.length() ;
        //f[i][j]表示str1的前i个字符转换为str2的前j个字符的最小编辑距离
        int[][] f = new int[len1 + 1][len2 + 1] ;
        for(int i = 0 ; i <= len1 ; i ++) {
            for(int j = 0 ; j <= len2 ; j ++) {
                if(i == 0) {
                    f[i][j] = j ;
                } else if(j == 0) {
                    f[i][j] = i ;
                } else {
                    //f[i][j-1] + 1表示在str1添加了有一个字符;f[i-1][j] + 1表示str1删除了一个字符
                    f[i][j] = Math.min(f[i][j-1] + 1 , f[i-1][j] + 1) ;
                    //f[i-1][j-1] + 1表示str1修改了一个字符
                    f[i][j] = Math.min(f[i][j] , f[i-1][j-1] + 1) ;
                    //当前字符相等
                    if(str1.charAt(i-1) == str2.charAt(j-1)) {
                        //不做改变,直接把问题交给子问题
                        f[i][j] = Math.min(f[i][j] , f[i-1][j-1]) ;
                    }
                }
            }
        }
        return f[len1][len2] ;
    }
}