题目:72. 编辑距离
思路:动态规划dp,时间复杂度0(nm)。
C++版本:
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.size(),m=word2.size();
//状态f[i][j]表示:word1[0,i]与word2[0,j]匹配的最少操作次数
vector<vector<int>> f(n+1,vector<int>(m+1,510));
//预处理
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++){
if(word1[i-1]==word2[j-1]){
f[i][j]=f[i-1][j-1];
}else{
//插入/删除
f[i][j]=min(f[i][j-1],f[i-1][j])+1;
//替换
f[i][j]=min(f[i][j],f[i-1][j-1]+1);
}
}
}
return f[n][m];
}
};
JAVA版本:
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[] x:f){
Arrays.fill(x,510);
}
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++){
if(word1.charAt(i-1)==word2.charAt(j-1)){
f[i][j]=f[i-1][j-1];
}else{
f[i][j]=Math.min(f[i][j-1],f[i-1][j])+1;
f[i][j]=Math.min(f[i][j],f[i-1][j-1]+1);
}
}
}
return f[n][m];
}
}