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

动态规划-1143.最长公共子序列-力扣(LeetCode)

一、题目解析

对于给定了两个字符串中,需要找到最长的公共子序列,也就是两个字符串所共同拥有的子序列。

二、算法原理

1、状态表示

 

dp[i][j]:表示s1的[0,i]和s2的[0,j]区间内所有子序列,最长子序列的长度

2、状态转移方程

根据最后一个位置的状态,分情况讨论

 

dp[i][j] s1[i]==s2[j]->dp[i-1][j-1]+1

          s1[i]!=s2[j]->max(dp[i][j-1],dp[i-1][j])

3、初始化

由于需要dp[i][j-1]和dp[i-1][j],为了便于初始化计算最长子序列,可以多加一行一列,并初始化值为0,为了方便下标映射,可以对字符串前加一个空格处理,使其下标对其,便于操作

4、填表顺序

 

为了避免所需值为计算,从上往下,从左往右开始填表

5、返回值

需要返回的是在s1和s2长度下的最长公共子串,所以return dp[m][n] 

依旧先画图思考,在自己实现,链接:1143. 最长公共子序列 - 力扣(LeetCode)

三、代码示例

 

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size(),n = text2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));text1 = " "+text1;text2 = " "+text2;for(int i = 1;i<=m;i++){for(int j = 1;j<=n;j++){if(text1[i] == text2[j]){dp[i][j]= dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}}return dp[m][n];}
};

 

 

看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见! 

 

 

相关文章:

  • OpenCV C++ 学习笔记(五):颜色空间转换、数值类型转换、图像混合、图像缩放
  • Flink 重启后事件被重复消费的原因与解决方案
  • 极智项目 | 基于PyQT+Whisper实现的语音识别软件设计
  • Rust 学习笔记:使用自定义命令扩展 Cargo
  • Matlab2018a---安装教程
  • Bash shell四则运算
  • python,shell,linux,bash概念的不同和对比联系
  • isp调试 blend模式指什么
  • 深圳南柯电子|储能EMC整改:如何节省70%整改费用的实战方法
  • 对比ODR直接赋值的非原子操作和BSRR原子操作
  • 亚远景科技助力东风日产通过ASPICE CL2评估
  • 4-C#的不同窗口传值
  • 如何计算H5页面加载时的白屏时间
  • 如何进行页面前端监控
  • window 显示驱动开发-DirectX 视频加速 2.0
  • 如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)
  • 资源-又在网上淘到金了-配乐下载
  • 8.RV1126-OPENCV 视频中添加LOGO
  • 实现对deepseek流式返回的json数据,进行逐字解析并实时渲染
  • Python中os模块详解
  • 自己做图片的网站/seo网站怎么优化
  • 做网站免费搭建/石家庄百度seo代理
  • 上海通信管理局网站/做任务赚佣金的平台
  • 哈尔滨模板建站公司/长沙网站优化指导
  • 做鞋子有什么好网站/网络营销是指
  • 中铁建设集团有限公司门户网站/有创意的网络广告案例