当前位置: 首页 > article >正文

LeetCode1143. 最长公共子序列(2024冬季每日一题 36)

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。

示例 2:

输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc” ,它的长度为 3 。

示例 3:

输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:

  • 1 < = t e x t 1. l e n g t h , t e x t 2. l e n g t h < = 1000 1 <= text1.length, text2.length <= 1000 1<=text1.length,text2.length<=1000
  • text1 和 text2 仅由小写英文字符组成。

思路:动态规划

  • 字符串 text1 ​ 和 text2 ​ 的长度分别为 m 和 n,用 f 表示其状态
  • 其中 f[i][j] 表示 text1[1…i] 和 text2[1…j] 的最长公共子序列的长度
    • 注意:为了跳过边界条件,则需要在 text1 和 text2 字符串前面增加一个不存在的字符,然后下标从 1 开始
  • 状态转移方程:
    • 当 text1[i]=text2[j] 时,将这两个相同的字符称为公共字符,考虑 text1[i−1] 和 text2 ​[j−1] 的最长公共子序列,再增加一个字符(即公共字符)即可得到 text1[i] 和 text2[j] 的最长公共子序列,因此 f[i][j]=f[i−1][j−1]+1。
    • 当 text1[i] !=text2[j] 时,考虑以下两项:
      • text1[1…i-1] 和 text2[1…j] 的最长公共子序列
      • text1[1…i] 和 text2[1…j-1] 的最长公共子序列
    • 取两者的最大值即可,所以有 f[i][j] = max(f[i-1][j], f[i][j-1]);
  • 所以最终的状态转移方程为:
    f[i][j] = max(f[i-1][j], f[i][j-1]);
    f[i][j] = max(f[i][j], f[i-1][j-1] + (text1[i] == text2[j]));
#include<iostream>
#include<cstring>

using namespace std;

class Solution {
public:
    //f[i][j] 表示 text1前i个字符与text2前j个字符中最大的公共子序列长度
    int f[1010][1010];
    int longestCommonSubsequence(string text1, string text2) {
        int n = text1.size(), m = text2.size();
        text1 = "#" + text1, text2 = "#" + text2;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++){
                f[i][j] = max(f[i-1][j], f[i][j-1]);
                f[i][j] = max(f[i][j], f[i-1][j-1] + (text1[i] == text2[j]));
            }
        return f[n][m];
    }
};

http://www.kler.cn/a/443295.html

相关文章:

  • 【算法刷题】leetcode hot 100 滑动窗口
  • Spring Boot教程之四十九:Spring Boot – MongoRepository 示例
  • Android车载音频系统目录
  • 解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。
  • 【docker系列】可视化Docker 管理工具——Portainer
  • unity3d-搞个场景漫游如何实现Alpha
  • barin.js(十四)GRU实战教程 - 文本情感分析之有害内容检测
  • 霍尔传感器在VR虚拟现实技术上的应用
  • Facebook 与数字社交的未来走向
  • 数据科学与SQL:如何利用本福特法则识别财务数据造假?
  • C++实现最大字段和
  • 简易分页制作
  • 大数据分析案例-基于XGBoost算法构建笔记本电脑价格预测模型
  • 【JAVA】JAVA接口公共返回体ResponseData封装
  • 点击展示大图预览
  • 易语言OCR证件照文字识别
  • 在 Mac M1 上使用 Docker 运行 Jenkins
  • [IT项目管理]九.项目质量管理
  • 联表查询相关语法
  • 梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语
  • rabbitMq的status报错Error: unable to perform an operation on node ‘rabbit……
  • WebRTC搭建与应用(一)-ICE服务搭建
  • DevExpress WinForms中文教程:Grid View - 如何实现固定列?
  • AndroidStudio XML不识别自定义控件
  • 【计算机毕设】基于Python预制菜可视化数据分析预测推荐系统(完整系统源码+数据库+详细部署教程)✅
  • 经典电荷泵/Charge pump——1998.JSSC