当前位置: 首页剑指offer刷题第六期问题详情 【动态规划专题】LeetCode 72. 编辑距离 本问题对应课程链接:剑指offer刷题第六期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 4 个回答
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
for(int i = 0; i < word1.length() + 1; i++)
dp[i][0] = i;
for(int j = 0; j < word2.length() + 1; j++)
dp[0][j] = j;
for(int i = 1; i < word1.length() + 1; i++){
for(int j = 1; j < word2.length() + 1; 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[word1.length()][word2.length()];
}
//时空复杂度均为On2
思路:定义数组 dp[i][j] 表示 word1 的前 i 个字符串 与 word2 的前 j 个字符串匹配的最小操作次数,则 dp[i][j] 可以有以下几种情况:
1. word1[i] word2[j]: dp[i][j] = dp[i-1][j-1]
2. word1[i] != word2[j]: dp[i][j] = min( dp[i-1][j-1](替换word1[i] word2[j]), dp[i-1][j] (删除 word1[i]), dp[i][j-1] (在 word1[i]后增加 word2[j]) ) + 1 (1 次操作次数)
“`c++> dp(m+1, vector(n+1, 0));
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.size(), m = word2.size();
vector
dp[0][0] = 0;
for (int i=0, j=0; j<=n; j++) { dp[i][j] = j; } for (int i=0, j=0; i<=m; i++) { dp[i][j] = i; } for (int i=1; i<=m; i++) { for (int j=1; j<=n; j++) { if (word2[i-1] == word1[j-1]) { dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i][j-1]) + 1; } } } return dp[m][n]; } }; ```