// 状态:F(i,j)-->word1的前i个字符变成word2的前j个字符
// 转移方程:通过一步变成F(i,j)的状态有三种:
//          F(i-1,j)删除word1第i个字符
//          F(i,j-1)插入一个字符即word2的第j个字符
//          F(i-1,j-1)替换word1的第i个字符为word2的第j个字符(但是如果原本就相等就不会加这一步替换了)
//          so:F(i,j)=min(F(i-1,j)+1,F(i,j-1)+1,word1[i-1]==word2[j-1]?F(i-1,j-1)):F(i-1,j-1)+1)
// 初始值:可以增加一个空串的辅助状态:F(i,0)=i;F(0,j)=j
// 返回结果:F(word1.size(),word2.size())
class Solution {
public:
    /**
     * 
     * @param word1 string字符串 
     * @param word2 string字符串 
     * @return int整型
     */
    int minDistance(string word1, string word2) {
        int row=word1.size();
        int col=word2.size();
        vector<vector<int> > min_distance(row+1,vector<int>(col+1));
        for(int i=0;i<=row;i++)
            min_distance[i][0]=i;
        for(int j=0;j<=col;j++)
            min_distance[0][j]=j;
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
            {
                min_distance[i][j]=min(min_distance[i-1][j],min_distance[i][j-1])+1;
                min_distance[i][j]=min((word1[i-1]==word2[j-1]?min_distance[i-1][j-1]:min_distance[i-1][j-1]+1),min_distance[i][j]);
            }
        }
        return min_distance[row][col];
    }
};