【动态规划-最长公共子序列(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 相同所需的最少的删除次数。

相关推荐
POLITE33 分钟前
Leetcode 19. 删除链表的倒数第 N 个结点 JavaScript (Day 11)
javascript·leetcode·链表
liu****6 分钟前
机器学习-线性回归
人工智能·python·算法·机器学习·回归·线性回归
智者知已应修善业13 分钟前
【数组删除重复数据灵活算法可修改保留重复数量】2024-3-4
c语言·c++·经验分享·笔记·算法
你怎么知道我是队长29 分钟前
C语言---字符串
java·c语言·算法
你怎么知道我是队长1 小时前
C语言---指针
c语言·数据结构·算法
汉克老师1 小时前
GESP2025年12月认证C++五级真题与解析(编程题2 (相等序列))
c++·算法·贪心算法·中位数·质数分解
前端小L1 小时前
双指针专题(九):谁是窗口里的老大?——「滑动窗口最大值」
javascript·算法·双指针与滑动窗口
CAU界编程小白1 小时前
Linux系统编程系列之模拟文件操作
linux·算法
萤虫之光1 小时前
有序数组中的单一元素(一)
数据结构·算法
颜酱2 小时前
从经典问题入手,吃透动态规划核心(DP五部曲实战)
前端·javascript·算法