583. 两个字符串的删除操作
72. 编辑距离
思路
动态规划,状态定义dp[i][j]
为w1前i个字符转换成w2前j个字符所需要的步骤
代码
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
let len1 = word1.length, len2 = word2.length;
// 初始化数组
let dp = Array(len1+1).fill(0).map(item => Array(len2 + 1).fill(0))
// 初始化值, dp[i][j]表示 w1前i个字符转换成w2前j个字符所需的步骤数
for(let i = 0; i <= len1; i ++) {
dp[i][0] = i
}
for(let j = 0; j <= len2; j ++) {
dp[0][j] = j
}
for(let i = 1; i <= len1; i ++) {
for(let j = 1; j <= len2; j ++) {
// 如果相等,则当前索引位置不需要变动
if (word1[i-1] === word2[j-1]) {
dp[i][j] = dp[i-1][j-1]
} else {
// 如果不相等,则进行转换操作,步骤+1
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
}
}
}
return dp[len1][len2]
};
复杂度分析
时间复杂度 #card=math&code=O%28N%5E2%29)
空间复杂度 #card=math&code=O%28N%5E2%29)