您现在的位置是:首页 >技术教程 >代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离网站首页技术教程

代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离

taoyong001 2025-05-13 12:01:03
简介代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离
  • 此题是动态规划所能解决的最经典题目
  • 动规五部曲
    • dp[i][j]表示以i - 1word1和以j - 1word2变为相同的最少操作次数
    • 递推公式:
      • if word1[i - 1] == word2[j - 1] {dp[i][j] = dp[i - 1][j - 1];}
      • else会有三种操作:增、删、替换
        • 增与删(两者是一致的,这两种操作互逆):d[i - 1][j] + 1dp[i][j - 1] + 1
        • 替换:dp[i - 1][j - 1] + 1
    • 初始化:和上一题一致
    • 递推过程
    • 打印
class Solution {
public:
    int minDistance(string word1, string word2) {
        int len1 = word1.size(), len2 = word2.size();
        std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1));
        for (int i = 0; i <= len1; ++i)
            dp[i][0] = i;
        for (int j = 0; j <= len2; ++j)
            dp[0][j] = j;
        for (int i = 1; i <= len1; ++i) {
            for (int j = 1; j <= len2; ++j) {
                if (word1[i - 1] == word2[j - 1])
                    dp[i][j] = dp[i - 1][j - 1];
                else {
                    dp[i][j] = std::min(dp[i - 1][j - 1] + 1, std::min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
                }
            }
        }
        return dp[len1][len2];
    }
};
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。