【Leetcode 每日一题】583. 两个字符串的删除操作 【中等】DP

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

示例:

输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"

提示:

给定单词的长度不超过500。
给定单词中的字符只含有小写字母。

题解:
一开始看到这个,想起来之前做过的一道编辑距离,然后就按照那个方式写了,后来发现这个题目还有另外一种解法。可以使用最长公共子序列的差值进行计算。

  1. 直接进行动态规划

    class Solution {
    public:
     int minDistance(string word1, string word2) {
         int m = word1.size();
         int n = word2.size();
         vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0x3f3f3f3f));
         dp[0][0] = 0;
         for(int i = 0; i <= m; i++){
             dp[i][0] = i;
         }
         for(int j = 0; j <= n; j++){
             dp[0][j] = j;
         }
         for(int i = 1; i <= m; i++){
             for(int j = 1; j <= n; j++){
                 if(word1[i - 1] == word2[j - 1]){
                     dp[i][j] = dp[i - 1][j - 1];
                 }
                 else{
                     dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1);
                     dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);
                 }
    
             }
         }
         return dp[m][n];
     }
    };
  2. 求最长公共子序列,求差值

    class Solution {
    public:
     int minDistance(string word1, string word2) {
         int m = word1.size();
         int n = word2.size();
         vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    
         for (int i = 1; i <= m; i++) {
             char c1 = word1[i - 1];
             for (int j = 1; j <= n; j++) {
                 char c2 = word2[j - 1];
                 if (c1 == c2) {
                     dp[i][j] = dp[i - 1][j - 1] + 1;
                 } else {
                     dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                 }
             }
         }
    
         int lcs = dp[m][n];
         return m - lcs + n - lcs;
     }
    };
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:02
鼠鼠深知pdd的强度很大,但是现在没有大厂offer,只有一些不知名小厂我是拒绝等秋招呢,还是接下?求大家帮忙判断一下!
水中水之下水道的鼠鼠:接了再说,不图转正的话混个实习经历也不错
投递拼多多集团-PDD等公司10个岗位 >
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务