编辑距离(Levenshtein距离)是一种衡量两个字符串差异的指标。它表示一个字符串转变成另一个字符串所需的最少单字符编辑操作次数,包括添加、删除或替换。
编辑距离算法的核心思想是通过动态规划的方式计算两个字符串之间的距离。假设我们有两个字符串A和B,长度分别为m和n。我们可以创建一个(m+1) x (n+1)的矩阵,其中每个元素d[i][j]表示将A的前i个字符转变为B的前j个字符所需的最少编辑操作次数。
根据题目要求,我们需要求得将A转变为B所需的最少编辑操作次数。因此,我们可以从矩阵的左上角开始,向右下角遍历矩阵,并将每个元素初始化为0。然后,我们根据以下三种情况进行转移:
当A的第i个字符与B的第j个字符相等时,d[i][j] = d[i-1][j-1]。
当A的第i个字符与B的第j个字符不相等时,我们可以选择删除A的第i个字符、替换A的第i个字符或插入B的第j个字符。因此,d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1。
当i=m或j=n时,表示已经到达矩阵的右下角或左下角,表示A或B已经变为空字符串。此时,我们需要计算将空字符串转变为B或A所需的最少编辑操作次数。因此,当i=m时,d[i][j] = d[i][j-1];当j=n时,d[i][j] = d[i-1][j]。
最终,矩阵的右下角的值即为所求的编辑距离。
以下是相应的Java代码实现:
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 0; 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][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
}
}
return dp[m][n];
}
该算法的时间复杂度为O(mn),空间复杂度为O(mn)。