• 算法训练第五十六天


    总结:今日是编辑距离问题的结束,对编辑距离问题的总结是要抓住dp的定义以及如何推出dp数组来抓住问题核心,比如经典题目编辑距离:dp数组的定义是dp[j][j]是以i - 1为尾的word1和j - 1为尾的word2的最少改变次数能使两个字符串相等,dp[i][j]则可由以下几种情况推出:当word1[i - 1]和word2[j - 1]相等时,则dp等于dp[i - 1][j - 1],不相等时:(以下摘抄自代码随想录)

    • 操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。

    即 dp[i][j] = dp[i - 1][j] + 1;

    • 操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。

    即 dp[i][j] = dp[i][j - 1] + 1;

    这里有同学发现了,怎么都是删除元素,添加元素去哪了。

    word2添加一个元素,相当于word1删除一个元素,例如 word1 = "ad" ,word2 = "a"word1删除元素'd' 和 word2添加一个元素'd',变成word1="a", word2="ad", 最终的操作数是一样!

    代码:

    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. vectorint>> dp(word1.size() + 1,vector<int>(word2.size() + 1,0));
    5. for(int i = 0;i <= word1.size();i++) dp[i][0] = i;
    6. for(int i = 0;i <= word2.size();i++) dp[0][i] = i;
    7. for(int i = 1;i <= word1.size();i++)
    8. {
    9. for(int j = 1;j <= word2.size();j++)
    10. {
    11. if(word1[i - 1] == word2[j - 1])
    12. dp[i][j] = dp[i - 1][j - 1];
    13. else
    14. dp[i][j] = min(dp[i - 1][j] + 1,min(dp[i][j - 1] + 1,dp[i - 1][j - 1] + 1));
    15. }
    16. }
    17. return dp[word1.size()][word2.size()];
    18. }
    19. };

    583. 两个字符串的删除操作 - 力扣(LeetCode)

    总结:距离问题的前置题目,为距离问题做铺垫,注意此题当word1[i - 1]和word2[j - 1]不相等时dp数组的求法与距离问题不同。

    代码:

    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. vectorint>> dp(word1.size() + 1,vector<int>(word2.size() + 1 ,0 ));
    5. for(int i = 0;i <= word1.size();i++) dp[i][0] = i;
    6. for(int i = 0;i <= word2.size();i++) dp[0][i] = i;
    7. for(int i = 1;i <= word1.size();i++)
    8. {
    9. for(int j = 1;j <= word2.size();j++)
    10. {
    11. if(word1[i - 1] == word2[j - 1])
    12. dp[i][j] = dp[i - 1][j - 1];
    13. else
    14. dp[i][j] = min(dp[i - 1][j] + 1,min(dp[i][j - 1] + 1,dp[i - 1][j - 1] + 2));
    15. }
    16. }
    17. return dp[word1.size()][word2.size()];
    18. }
    19. };

  • 相关阅读:
    1334. 阈值距离内邻居最少的城市
    Nacos集群搭建
    JVM垃圾回收——垃圾收集器(一)
    学习笔记-Flutter 布局(三)- FittedBox、AspectRatio、ConstrainedBox详解
    Linux 工作使用场景
    PowerBI工作区连接Log Aanlytics
    3 Cadence R8051XC2 芯片IP的寄存器介绍
    Net 高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等)
    求二叉树的高度——函数递归的思想
    GBase 8a MPP集群管理之虚拟集群镜像表
  • 原文地址:https://blog.csdn.net/zhangke_EX/article/details/132699487