/*
dp[i][j]表示word1前i个单词与word2前j个单词的最少操作数
if(word[i]==word[j]) dp[i][j]=dp[i-1][j-1] 如果相同的情况就两者都往前跳
else dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
dp[i-1][j]表示word1删除一个word2的单词这是状态转移为dp[i-1][j]+1
dp[i][j-1]表示word1添加一个word2单词这时候状态转移为dp[i][j-1]+1
dp[i-1][j-1]表示word1替换一个word2单词
自底向上
*/
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.size();
int m=word2.size();
int k=max(n,m);
vector<vector<int>> dp(k+10,vector<int>(k+10));
for(int i=1;i<=n;i++) dp[i][0]=i;
for(int j=1;j<=m;j++) dp[0][j]=j;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(word1[i-1] == word2[j-1])
dp[i][j]=dp[i-1][j-1];
else
{
dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
}
}
}
return dp[n][m];
}
};