动态规划
- 思路:
- 假设 dp[i][j] 是 word1 长度 i 和 word2 长度 j 的编辑距离;
- 有三种编辑方式:插入、删除、替换,即 word1 插入、word2 插入、替换;
- 那么 dp[i][j] 可以是:
- dp[i - 1][j] 在 word1 中插入一个字符;
- dp[i][j - 1] 在 word2 中插入一个字符;
- dp[i - 1][j - 1] 如果 word1[i - 1] == word2[j - 1](word1 的第 i 个字符与 word2 的第 j 个字符相等)那么 dp[i][j] = dp[i - 1][j - 1],否则需要进行一次替换;
- dp[i][j] 选择三种编辑中距离最小的即可;
- 边界条件:
- dp[i][0] = i (word2 插入 i 次)
- dp[0][j] = j (word1 插入 i 次)
class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size();int n = word2.size();if (m * n == 0) {return m + n;}std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1));for (int i = 0; i < m + 1; ++i) {dp[i][0] = i;}for (int j = 0; j < n + 1; ++j) {dp[0][j] = j;}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; ++j) {int dp1 = dp[i - 1][j] + 1;int dp2 = dp[i][j - 1] + 1;int dp3 = dp[i - 1][j - 1];if (word1[i - 1] != word2[j - 1]) {dp3 += 1;}dp[i][j] = std::min(dp1, std::min(dp2, dp3));}}return dp[m][n];}
};
——————————————————————————————————