题目描述
AC代码
定义一个二维数组
f
[
]
[
]
f[][]
f[][],
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示单词word1中的前
i
i
i个字母变换到单词word2的前
j
j
j个字母的最少操作次数。
我们先来考虑一下word1变成word2的前一步,该步操作有3种可能,我们可以insert、delete、replace。
- 插入:插入时,可以肯定的是word1的前
i
i
i个字母已经变成word2的前
j
−
1
j-1
j−1个字母了,只需要插入一个字母,就可以完成word1到word2.
的转换了,所以我们可以得出 f [ i ] [ j ] = f [ i ] [ j − 1 ] + 1 f[i][j]=f[i][j-1]+1 f[i][j]=f[i][j−1]+1. - 删除:删除时可以肯定的是word1的前 i − 1 i-1 i−1个字母已经和word2的前 j j j个字母想同了,只需要删除掉第i个字母,就大功告成。所以我们可以得出 f [ i ] [ j ] = f [ i − 1 ] [ j ] + 1 f[i][j]=f[i-1][j]+1 f[i][j]=f[i−1][j]+1.
- 替换:word1的前 i − 1 i-1 i−1个字母已经和word2的前 j − 1 j-1 j−1个字母相同,那么有 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + 1 f[i][j]=f[i-1][j-1]+1 f[i][j]=f[i−1][j−1]+1.如果已经第 i i i个和第 j j j个已经相同了,不需要替换的话,那么又有 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] f[i][j]=f[i-1][j-1] f[i][j]=f[i−1][j−1].
/*
分类:动态规划
*/
class Solution {
public int minDistance(String word1, String word2) {
int n=word1.length(),m=word2.length();
int[][] f=new int[n+1][m+1];
for(int i=0;i<=n;i++) f[i][0]=i;
for(int i=0;i<=m;i++) f[0][i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
f[i][j]=Math.min(f[i][j-1],f[i-1][j])+1;
int p=word1.charAt(i-1)==word2.charAt(j-1)?0:1;
f[i][j]=Math.min(f[i][j],f[i-1][j-1]+p);
}
return f[n][m];
}
}