import java.util.*;


/** 编辑距离
 * 给定两个单词word1和word2,请计算将word1转换为word2至少需要多少步操作。
 * 你可以对一个单词执行以下3种操作:
 * a)在单词中插入一个字符
 * b)删除单词中的一个字符
 * c)替换单词中的一个字符
 * 状态: 将word1的前i个字符变为word2的前j个字符需要多少步 f(i, j)
 * 分析: 三种操作 i: 插入操作: f(i, j-1) ->f(i, j)
 *              d: 删除操作: f(i-1, j)+1 ->f(i, j)
 *              r: 替换操作: 1. word1[i] != word2[j]时: f(i-1, j-1) -> f(i, j)
 *       三种操作中取最小值
 * 转移方程: f(i, j) = min( f(i-1, j), f(i+1, j))
 *         if(word1[i]!=word[j]) f(i-1,j-1)+1
 *         else f(i-1, j-1)+1 -> f(i, j)
 * 初始状态: f[0][i] = i
 *         f[i][0] = i
 */
public class Solution {
    public int minDistance (String word1, String word2) {
        // write code here
        if(word1.isEmpty() || word2.isEmpty()){
            return Math.max(word1.length(), word2.length());
        }
        int row = word1.length();
        int col = word2.length();
        int [][]mind = new int[row+1][col+1];
        //初始化
        for(int i=0;i<=row;i++){
            mind[i][0]=i;
        }
        for(int i=0;i<=col;i++){
            mind[0][i]=i;
        }
        for(int i=1; i<=row;i++){
            for(int j=1; j<=col ;j++){
                mind[i][j] = Math.min(mind[i][j-1], mind[i-1][j])+1;
                if(word1.charAt(i-1) == word2.charAt(j-1)){
                    mind[i][j] = Math.min(mind[i][j], mind[i-1][j-1]);
                } else {
                    mind[i][j] = Math.min(mind[i][j], mind[i-1][j-1]+1);
                }
            }
        }
        return mind[row][col];
    }
}