【发布时间】:2017-04-23 12:39:40
【问题描述】:
我正在研究如何找到将 word1 转换为 word2 所需的最小步骤数,并遇到了以下带有规则的实现:
给定两个单词 word1 和 word2,找出将 word1 转换为 word2 所需的最小步数。 (每个操作都计为 1 步。)
您可以对一个单词进行以下 3 种操作:
a) 插入一个字符
b) 删除一个字符
c) 替换一个字符
而实现的思路是:
用distance[i][j]表示word1[0,i)和word2[0,j)之间的最短编辑距离。然后比较word1[0,i)和word2[0,j)的最后一个字符,分别是c和d(c == word1[i-1],d == word2[j-1]):
如果 c == d,则:距离[i][j] = 距离[i-1][j-1]
否则我们可以使用三个操作将word1转换为word2:
(a) 如果我们将 c 替换为 d:distance[i][j] = distance[i-1][j-1] + 1;
(b) 如果我们在 c 之后添加 d:distance[i][j] = distance[i][j-1] + 1;
(c) 如果我们删除 c: distance[i][j] = distance[i-1][j] + 1;
代码:
public class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
//distance[i][j] is the distance converse word1(1~ith) to word2(1~jth)
int[][] distance = new int[len1 + 1][len2 + 1];
for (int j = 0; j <= len2; j++)
{distance[0][j] = j;} //delete all characters in word2
for (int i = 0; i <= len1; i++)
{distance[i][0] = i;}
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) { //ith & jth
distance[i][j] = distance[i - 1][j - 1];
} else {
distance[i][j] = Math.min(Math.min(distance[i][j - 1], distance[i - 1][j]), distance[i - 1][j - 1]) + 1;
}
}
}
return distance[len1][len2];
}
}
我的问题是 distance[][] 代表什么?为每个二维索引存储一个值有什么意义?为什么你在int[][] distance = new int[len1 + 1][len2 + 1]; 的len1 和len2 上加1?
例如,据我了解,它是将word1的每个字符与word2进行比较,但是一旦两个字符匹配,两个单词的索引不应该向上移动吗?意思是,如果String word1="ab";和String word2="ac",由于a字符匹配,不需要比较word1中的a和word2中的c,而是上移索引,比较word1中的b到c 在 word2 中。
最后,这三个操作如何代表它的方式,例如distance[i-1][j-1]怎么代表替换?
提前感谢您,我们将接受回答/赞成票。
【问题讨论】:
标签: java algorithm dynamic-programming