• LeetCode·583.两个字符串的删除操作·动态规划


    链接:https://leetcode.cn/problems/delete-operation-for-two-strings/solution/-by-xun-ge-v-hv40/
    来源:力扣(LeetCode
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

    题目

     

    示例

     

    思路

    • 确定dp数组(dp table)以及下标的含义

    dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

    • 确定递推公式
      • 当word1[i - 1] 与 word2[j - 1]相同的时候
        • 当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];
      • 当word1[i - 1] 与 word2[j - 1]不相同的时候
        • 当word1[i - 1] 与 word2[j - 1]不相同的时候,有三种情况:
          • 情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1
          • 情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
          • 情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2

    那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});

    • dp数组如何初始化

    从递推公式中,可以看出来,dp[i][0] 和 dp[0][j]是一定要初始化的。

    dp[i][0]:word2为空字符串,以i-1为结尾的字符串word2要删除多少个元素,才能和word1相同呢,很明显dp[i][0] = i。

    dp[0][j]的话同理,所以代码如下:

    1. for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
    2. for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
    • 确定遍历顺序

    从递推公式 dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i - 1][j], dp[i][j - 1]) + 1); 和dp[i][j] = dp[i - 1][j - 1]可以看出dp[i][j]都是根据左上方、正上方、正左方推出来的。

    所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。

    代码

    1. #define MIN(a, b) ((a) < (b) ? (a) : (b))
    2. int minDistance(char * word1, char * word2){
    3. int len1 = strlen(word1);
    4. int len2 = strlen(word2);
    5. int dp[len1+1][len2+1];
    6. for(int i = 0; i <= len1; i++) dp[i][0] = i;
    7. for(int i = 0; i <= len2; i++) dp[0][i] = i;//定义并初始化
    8. for(int i = 1; i <= len1; i++)
    9. {
    10. for(int j = 1; j <= len2; j++)//枚举字符串中每一个元素
    11. {
    12. if(word1[i-1] == word2[j-1])//相同,不需要任意操作
    13. {
    14. dp[i][j] = dp[i-1][j-1];
    15. }
    16. else//不相同时,可以删除自己或者word2或者都删了
    17. {
    18. dp[i][j] = MIN(dp[i][j-1] + 1, MIN(dp[i-1][j-1] + 2, dp[i-1][j] + 1));
    19. }
    20. }
    21. }
    22. return dp[len1][len2];
    23. }
    24. 作者:xun-ge-v
    25. 链接:https://leetcode.cn/problems/delete-operation-for-two-strings/solution/-by-xun-ge-v-hv40/
    26. 来源:力扣(LeetCode)
    27. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Swagger有哪些非常重要的注释?
    Linux驱动实践:带你一步一步编译内核驱动程序
    智慧楼宇联网智能门锁解决方案
    Python数据分析教程06:蒙特卡洛采样、拉丁超立方采样方法及其python简单实现
    前端文件、图片直传OOS、分片上传、el-upload上传(vue+elementUI)
    [SpringMVC笔记] SpringMVC-05-不同类型的参数传递
    第二次线上面试总结(2022.9.14)
    VB实现长标题文本压缩
    详解设计模式:工厂方法模式
    物联网,智慧城市的数字化转型引擎
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/127069230