• 代码随想录训练营第五十六天| 583. 两个字符串的删除操作 、72. 编辑距离


    583. 两个字符串的删除操作

    题目链接/文章讲解/视频讲解:代码随想录

    1.代码展示

    1. //583.两个字符串的删除操作
    2. int minDistance(string word1, string word2) {
    3. //step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2
    4. //删除其元素后相同所需最小的删除步数
    5. vectorint>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
    6. //step2 状态转移方程
    7. //if (word1[i - 1] == word[j - 1]) 此时不需要删除,dp[i][j] = dp[i - 1][j - 1];
    8. //else ,dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2);
    9. //对应着三种情况,删除word1[i - 1]或者word2[j - 1]或者同时删除
    10. //step3 初始化
    11. for (int i = 0; i <= word1.size(); i++) {
    12. dp[i][0] = i;
    13. }
    14. for (int j = 0; j <= word2.size(); j++) {
    15. dp[0][j] = j;
    16. }
    17. //step4 开始遍历
    18. for (int i = 1; i <= word1.size(); i++) {
    19. for (int j = 1; j <= word2.size(); j++) {
    20. if (word1[i - 1] == word2[j - 1]) {
    21. dp[i][j] = dp[i - 1][j - 1];
    22. }
    23. else {
    24. dp[i][j] = min({ dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2 });
    25. }
    26. }
    27. }
    28. return dp[word1.size()][word2.size()];
    29. }

    2.本题小节

            思考: 首先明确dp[i][j]的含义是下标以i-1为结尾的word1和以下标为j-1结尾的word2删除元素相等所需的最少步骤。当word1[i - 1] == word2[j - 1]时,此时不需要删除元素,因此dp[i][j] = dp[i - 1][j - 1];当不相等时,此时既可以删除word1下标i-1处的元素,对应的是dp[i - 1][j] + 1,也可以删除word2下标j-1处的元素,对应的是dp[i][j-1] + 1,也可以是同时删除掉,对应的是dp[i - 1][j - 1] + 2,因此dp[i][j]从上面三种情况中选择最小的。初始化时要注意,dp[i][0]对应的位置初始化为i,dp[0][j]对应位置初始化为j,这个很好想。

            步骤:注意思考的内容,按照步骤来即可。

    72. 编辑距离

     题目链接/文章讲解/视频讲解:代码随想录

    1.代码展示

    1. //72.编辑距离
    2. int minDistance(string word1, string word2) {
    3. //step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2
    4. //相同需要操作(增加、删减、替换)的次数
    5. vectorint>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
    6. //step2 状态转移方程
    7. //if (word1[i - 1] == word[j - 1]) 此时不需要处理,dp[i][j] = dp[i - 1][j - 1];
    8. //else ,dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
    9. //对应着三种情况,删掉word1[i - 1](删除),删掉word2[j - 1](增加),替换
    10. //step3 初始化
    11. for (int i = 0; i <= word1.size(); i++) {
    12. dp[i][0] = i;
    13. }
    14. for (int j = 0; j <= word2.size(); j++) {
    15. dp[0][j] = j;
    16. }
    17. //step4 开始遍历
    18. for (int i = 1; i <= word1.size(); i++) {
    19. for (int j = 1; j <= word2.size(); j++) {
    20. if (word1[i - 1] == word2[j - 1]) {
    21. dp[i][j] = dp[i - 1][j - 1];
    22. }
    23. else {
    24. dp[i][j] = min({ dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1 });
    25. }
    26. }
    27. }
    28. return dp[word1.size()][word2.size()];
    29. }

    2.本题小节

            思考:dp[i][j]的含义是以下标i-1为结尾的word1通过增加,删除,替换能够变成以下标j-1为结尾的word2所需要的最小步骤。当word1[i - 1] == word2[j - 1]时,此时不需要操作,则dp[i][j] = dp[i - 1][j - 1];当不相等时,可以通过删除(删除word1[i - 1])、增加(删除word2[j - 1])、和替换(word1[i - 1]替换为word[j - 1])来操作,分别对应的时dp[i - 1][j] + 1、dp[i][j - 1] + 1、dp[i - 1][j - 1] + 1,选择最小情况,初始化和上题一样。

            基本步骤:根据思考和动态规划的步骤来即可。

    编辑距离总结:代码随想录

  • 相关阅读:
    js中 数组的操作 push(),pop(),shift(),unshift() 简介
    反射、枚举和lambda表达式
    13年实践经验总结,200多页PPT的企业级推荐系统原理与实践,助力企业精细化与个性化运营...
    细数APDL中的流程控制命令
    DolphinScheduler——介绍及架构设计
    leetcode/子串中不能有重复字符的最长子串
    【虹科方案】虹科数字化仪——机械测量的最佳方案!(二)
    如何设计开发一对一交友App吸引更多活跃用户
    ZYNQ_project:key_breath
    概要设计:描绘软件结构的图形工具,结构图既能表示模块间的数据信息、控制信息,也能表示选择调用和循环调用关系。
  • 原文地址:https://blog.csdn.net/weixin_62453859/article/details/132723409