【动态规划-最长公共子序列(LCS)】力扣583. 两个字符串的删除操作

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

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

示例 1:

输入: word1 = "sea", word2 = "eat"

输出: 2

解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"

示例 2:

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

输出:4

提示:

1 <= word1.length, word2.length <= 500

word1 和 word2 只包含小写英文字母

最长公共子序列(LCS)

cpp 复制代码
class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.length(), n = word2.length();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i = 1; i <= m; i++){
            char c1 = word1.at(i-1);
            for(int j = 1; j <= n; j++){
                char c2 = word2.at(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]);
                }
            }
        }

        return m+n-2*dp[m][n];
    }
};

这实际上是力扣1143. 最长公共子序列 的变形题目,当你求出了两个字符串的最长公共子序列,那么他们剩下的字符就是需要删除的最少操作。所以可以参考力扣1143题(主页有)来求出最长公共子序列,然后最后两个字符串的长度相加,减去两倍的最长公共子序列,就是使得 word1 和 word2 相同所需的最少的删除次数。

相关推荐
花月C23 分钟前
线性动态规划(Linear DP)
算法·动态规划·代理模式
派大星~课堂26 分钟前
【力扣-148. 排序链表】Python笔记
python·leetcode·链表
hetao17338371 小时前
2025-03-24~04-06 hetao1733837 的刷题记录
c++·算法
小白菜又菜1 小时前
Leetcode 657. Robot Return to Origin
python·leetcode·职场和发展
_深海凉_1 小时前
LeetCode热题100-环形链表
算法·leetcode·链表
原来是猿1 小时前
Linux进程信号详解(三):信号保存
开发语言·c++·算法
2401_892070981 小时前
算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战
c++·算法·线段树·最大子段和
memcpy01 小时前
LeetCode 904. 水果成篮【不定长滑窗+哈希表】1516
算法·leetcode·散列表
老四啊laosi1 小时前
[双指针] 8. 四数之和
算法·leetcode·四数之和
汀、人工智能1 小时前
[特殊字符] 第24课:反转链表
数据结构·算法·链表·数据库架构··反转链表