LeetCode/编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
对于最优问题计算,考虑用动态规划,这里dp[i][j]设为
为word1前i个字符和word2前j个字符的最少操作数
随着往后遍历,需要考虑的字符串长度增加,分别需要考虑由增添、删除、修改三种方式转移过来的状态,取最小值
增,dp[i][j] = dp[i][j - 1] + 1
删,dp[i][j] = dp[i - 1][j] + 1
改,dp[i][j] = dp[i - 1][j - 1] + 1
class Solution {
public:
int minDistance(string word1, string word2) {
//最优问题使用动态规划,设dp[i][j]为word1前i个字符和word2前j个字符的最少操作数
//接着考虑状态转移方程和边界条件
//显然dp[0][j]=j,dp[i][0]=i
//dp[i][j]
int n = word1.size();
int m = word2.size();
// 有一个字符串为空串
if (n * m == 0) return n + m;
// DP 数组
vector<vector<int>> D(n + 1, vector<int>(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[i - 1] != word2[j - 1]) left_down += 1;//不相等需要替换
D[i][j] = min(left, min(down, left_down));
}
}
return D[n][m];
}
};