• day-56 代码随想录算法训练营(19)动态规划 part 16


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

    思路一:
    • 1.dp存储:以word1[i-1]结尾,word2[j-1]结尾,最少进行dp[i][j]次操作
    • 2.动态转移方程: if(word1[i-1]==word2[i-1]) dp[i][j]=dp[i-1][j-1];
    •                 else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1)
    • 3.初始化:dp[i][0]=i   dp[0][j]=j
    • 4.遍历顺序:1~尾巴
    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. int n=word1.size(),m=word2.size();
    5. vectorint>>dp(n+1,vector<int>(m+1,0));
    6. for(int i=0;i<=n;i++) dp[i][0]=i;//相同时需要删除所有字符串
    7. for(int j=0;j<=m;j++) dp[0][j]=j;
    8. for(int i=1;i<=n;i++){
    9. for(int j=1;j<=m;j++){
    10. if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];//不需要操作
    11. else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);//两个字符串各自的操作取最小
    12. }
    13. }
    14. return dp[n][m];
    15. }
    16. };

    72.编辑距离

    思路:
    • 1.dp存储:以word1[i]结尾,word2[j]结尾,使两个字符串相同的最小操作次数
    • 2.动态转移方程: if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];
    •                 else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1)
    • 3.初始化:dp[i][0]=i   dp[0][j]=j
    • 4.遍历顺序:1~n 1~m
    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. int n=word1.size(),m=word2.size();
    5. vectorint>>dp(n+1,vector<int>(m+1,0));
    6. for(int i=0;i<=n;i++) dp[i][0]=i;
    7. for(int j=0;j<=m;j++) dp[0][j]=j;
    8. for(int i=1;i<=n;i++){
    9. for(int j=1;j<=m;j++){//添加和删除都是一样的,两边各添加和删除;改变就是上一次的值+1
    10. if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];
    11. else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));
    12. }
    13. }
    14. return dp[n][m];
    15. }
    16. };

  • 相关阅读:
    python随手小练5
    一天梳理完react面试题
    使用BigDecimal的坑
    【nacos】5.3 nacos 更新mqtt配置,自动加载连接EMQX
    【系统架构】-什么是软件架构的5大风格
    记一次 .NET 某拍摄监控软件 卡死分析
    STM32输出互补死区刹车PWM
    【通信原理】揭开傅里叶级数与傅里叶变换的神秘面纱
    MySQL第七讲·怎么利用聚合函数实现高效地分组统计?
    【JDBC】----封装工具类和ORM
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/133018427