72. 编辑距离
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例 2:
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
提示:
0 <= word1.length, word2.length <= 500
word1
和word2
由小写英文字母组成
思路
想用LCS(失败)
动态规划+状态转移
代码
动态规划+状态转移
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
// 有一个字符串为空串
if (n * m == 0) {
return n + m;
}
//直接生成字符数组
char[] charArray1 = word1.toCharArray();
char[] charArray2 = word2.toCharArray();
// dp[j] 表示 word1[0...i] 转换为 word2[0...j] 的最小编辑距离
int[] dp = new int[n + 1];
// 初始化:word1 为空串时,需要插入 j 个字符
for (int j = 0; j <= n; j++) {
dp[j] = j;
}
// 动态规划填表
for (int i = 1; i <= m; i++) {
int prev = dp[0]; // 保存 dp[i-1][j-1]
dp[0] = i; // word2 为空串时,需要删除 i 个字符
for (int j = 1; j <= n; j++) {
int temp = dp[j]; // 保存下一轮的 dp[i-1][j-1]
if (charArray1[i - 1] == charArray2[j - 1]) {
// 字符相同,不需要操作
dp[j] = prev;
} else {
// 字符不同,取三种操作的最小值
dp[j] = Math.min(Math.min(dp[j - 1] + 1, // 插入
dp[j] + 1), // 删除
prev + 1 // 替换
);
}
prev = temp;
}
}
return dp[n];
}
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 孤寂灬无痕
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果