编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
动态规划
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int dp[][] = new int[m + 1][n + 1];
//""经过0次变换成为""
dp[0][0] = 0;
//base case
//1.dp的第一列初始化:表示word1经过多少次删除操作成为空串""
for(int i = 1; i <= m; i++) {
dp[i][0] = i;
}
//1.dp的第一列初始化:表示空串""经过多少次添加操作成为word2
for(int j = 1; j <= n; j++) {
dp[0][j] = j;
}
// 自底向上求解
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(word1.charAt(i - 1) == word2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
//dp[i - 1][j] + 1 表示删除word1中i处的字符(因为该字符不在word2的j中),操作次数+1
//dp[i][j - 1] + 1 表示word1在i之后添加一个字符匹配word2的j处字符,操作次数+1
//dp[i - 1][j - 1] + 1 表示将word1的i处字符替换为word2的j处字符,操作次数+1
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
}
}
}
// 储存着整个 word1 和 word2 的最小编辑距离
return dp[m][n];
}
private int min(int a, int b, int c) {
return Math.min(a, Math.min(b, c));
}
}