class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
// 有一个字符串为空串
if (n * m == 0) {
return n + m;
}
// DP 数组
int[][] D = new int[n + 1][m + 1];
// 边界状态初始化
for (int i = 0; i < n + 1; i++) {
D[i][0] = i;
}
for (int j = 0; j < m + 1; j++) {
D[0][j] = j;
}
// 计算所有 DP 值
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
int left = D[i - 1][j] + 1;
int down = D[i][j - 1] + 1;
int left_down = D[i - 1][j - 1];
if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
left_down += 1;
}
D[i][j] = Math.min(left, Math.min(down, left_down));
}
}
return D[n][m];
}
}
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(n + 1):
dp[0][i] = i
for i in range(m + 1):
dp[i][0] = i
for i in range(1, m + 1):
for j in range(1, n + 1):
if (word1[i - 1] != word2[j - 1]):
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
else:
dp[i][j] = dp[i - 1][j - 1]
return dp[m][n]
共以下 9 个回答
“`java
class Solution {
public int minDistance(String word1, String word2) {
//word1前i位转换word2前j位所有步数为dp[i][j]
//word[i] = word[j],则dp[i][j] = dp[i-1][j-1];
//word[i] != word[j],则有三种操作,插入,删除,替换
//dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j],dp[i][j+1]) + 1;
int l1 = word1.length();
int l2 = word2.length();
if (l1 == 0){
return l2;
}
if (l2 == 0){
return l1;
}
int[][] dp = new int[l1+1][l2+1];
//word1长度为0时
for (int j = 0; j <= l2; j++) { dp[0][j] = j; } //word2长度为0时 for (int i = 0; i <= l1; i++) { dp[i][0] = i; } for (int i = 1; i <= l1; i++) { for (int j = 1; j <= l2; 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-1], dp[i-1][j]), dp[i][j-1]) + 1; } } } return dp[l1][l2]; } }
好难
MY时间复杂度:O(mn)
空间复杂度:O(mn)
动态规划,官解,好难
时间:O(mn)
空间:O(mn)
C++实现
“`C++> dp(word1.size() + 1, vector(word2.size() + 1, 0));
class Solution {
public:
int minDistance(string word1, string word2) {
vector
};
“`
做一次看一次答案系列
动态规划