• 72.编辑距离 | 583.两个字符串的删除操作


    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

    你可以对一个单词进行如下三种操作:

    插入一个字符
    删除一个字符
    替换一个字符
     

    示例 1:

    输入:word1 = "horse", word2 = "ros"
    输出:3
    解释:
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')
    示例 2:

    输入:word1 = "intention", word2 = "execution"
    输出:5
    解释:
    intention -> inention (删除 't')
    inention -> enention (将 'i' 替换为 'e')
    enention -> exention (将 'n' 替换为 'x')
    exention -> exection (将 'n' 替换为 'c')
    exection -> execution (插入 'u')

    思路:动态规划

    经典动态规划:编辑距离 :: labuladong的算法小抄 (gitee.io)

    dp函数+备忘录 

    1. //dp函数+备忘录
    2. class Solution {
    3. public:
    4. int minDistance(string word1, string word2)
    5. {
    6. vectorint>> memo(word1.size(),vector<int>(word2.size(),1000));
    7. return dp(word1,word2,0,0,memo);
    8. }
    9. //dp函数定义:返回把s1[i..]转换成s2[j..]所使用的最小操作数
    10. int dp(string& s1,string& s2,int i,int j,vectorint>>& memo)
    11. {
    12. if(i>=s1.size())//s1下标越界,说明还要把s2剩下的字母都添加到s1上
    13. return s2.size()-j;
    14. if(j>=s2.size())//s2下标越界,说明还要把s1多余的字母都删掉
    15. return s1.size()-i;
    16. if(memo[i][j]!=1000)//备忘录,减少重复计算
    17. return memo[i][j];
    18. //动态转移
    19. if(s1[i]==s2[j])
    20. memo[i][j]=dp(s1,s2,i+1,j+1,memo);
    21. else
    22. memo[i][j]=1+min(min(dp(s1,s2,i+1,j+1,memo),dp(s1,s2,i+1,j,memo)),dp(s1,s2,i,j+1,memo));
    23. return memo[i][j];
    24. }
    25. };

    dp数组

    1. class Solution{
    2. public:
    3. int minDistance(string word1,string word2)
    4. {
    5. //dp数组定义:把s1[0..i]转换成s2[0..j]的最少操作数是dp[i+1][j+1]
    6. vectorint>> dp(word1.size()+1,vector<int>(word2.size()+1));
    7. for(int i=0;i<=word1.size();i++)
    8. {
    9. dp[i][0]=i;
    10. }
    11. for(int j=0;j<=word2.size();j++)
    12. {
    13. dp[0][j]=j;
    14. }
    15. for(int i=1;i<=word1.size();i++)
    16. {
    17. for(int j=1;j<=word2.size();j++)
    18. {
    19. if(word1[i-1]==word2[j-1])
    20. dp[i][j]=dp[i-1][j-1];
    21. else
    22. dp[i][j]=1+min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]));
    23. }
    24. }
    25. return dp[word1.size()][word2.size()];
    26. }
    27. };

     

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

    给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数。

    每步 可以删除任意一个字符串中的一个字符。

    示例 1:

    输入: word1 = "sea", word2 = "eat"
    输出: 2
    解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"
    示例  2:

    输入:word1 = "leetcode", word2 = "etco"
    输出:4

    dp函数+备忘录 

    1. //dp函数+备忘录
    2. class Solution {
    3. public:
    4. int minDistance(string word1, string word2) {
    5. vectorint>> memo(word1.size(),vector<int>(word2.size(),1000));
    6. return dp(word1,word2,0,0,memo);
    7. }
    8. //dp函数定义:返回使得s[i..]和s[j..]相同所需的最小步数
    9. int dp(string& s1,string& s2,int i,int j,vectorint>>& memo)
    10. {
    11. if(i>=s1.size())
    12. return s2.size()-j;
    13. if(j>=s2.size())
    14. return s1.size()-i;
    15. if(memo[i][j]!=1000)
    16. return memo[i][j];
    17. if(s1[i]==s2[j])
    18. memo[i][j]=dp(s1,s2,i+1,j+1,memo);
    19. else
    20. memo[i][j]=1+min(dp(s1,s2,i+1,j,memo),dp(s1,s2,i,j+1,memo));
    21. return memo[i][j];
    22. }
    23. };

     dp数组

    1. //dp数组
    2. class Solution {
    3. public:
    4. int minDistance(string word1, string word2) {
    5. //dp[i][j]表示使word1[0..i-1]和word2[0..j-1]相同所需的最小步数
    6. vectorint>> dp(word1.size()+1,vector<int>(word2.size()+1));
    7. for(int i=0;i<=word1.size();i++)
    8. dp[i][0]=i;
    9. for(int j=0;j<=word2.size();j++)
    10. dp[0][j]=j;
    11. for(int i=1;i<=word1.size();i++)
    12. {
    13. for(int j=1;j<=word2.size();j++)
    14. {
    15. if(word1[i-1]==word2[j-1])
    16. dp[i][j]=dp[i-1][j-1];
    17. else
    18. dp[i][j]=1+min(dp[i-1][j],dp[i][j-1]);
    19. }
    20. }
    21. return dp[word1.size()][word2.size()];
    22. }
    23. };
  • 相关阅读:
    普元中间件Primeton AppServer6.5部署SuperMap iServer
    【Java】Java 虚拟机常考题
    中国地质大学许少辉著《乡村振兴战略下传统村落文化旅游设计》图书馆荐购辉少许
    图像分割简述
    十五. 实战——mysql建库建表 字符集 和 排序规则
    postgres 空间坐标转换和获取geom中心点
    更新详情 | Flutter 3.22 与 Dart 3.4
    项目管理平台—基于Jira平台—工作流
    Python爬虫大作业+数据可视化分析(抓取python职位)
    jmeter多个接口测试
  • 原文地址:https://blog.csdn.net/weixin_50437588/article/details/126445320