给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
leetcode
解题思路:动态规划。
- 首先建立状态表示数组,通过一个二维数组,表示两个字符串,在各自不同的长度下,产生匹配所需的最少操作数。
- 先初始化,就是当一个字符串为空,那么最小操作数就是另一个字符串的长度值,因为全部都是增加操作即可。
- 然后是状态转移,两个字符串所有的字符匹配组合情况。
- 如果当前字符相同,则当前的操作数等于二者去掉当前字符,截取的前一段字符串的比较情况。而且不需要与当前状况比较取最小值,因为肯定前者更小。
- 如果当前字符不相同,就需要比较增加和替换那个操作能获得更小的操作数了。
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 + 1; i++) f[i][0] = i;
for(int i = 0; i < m + 1; i++) f[0][i] = i;
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; 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 - 1][j], f[i][j - 1]) + 1;
// 替换操作
f[i][j] = Math.min(f[i - 1][j - 1] + 1, f[i][j]);
}
}
}
return f[n][m];
}
}