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

动态规划-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];}
};

 

 

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

 

 

http://www.xdnf.cn/news/10766.html

相关文章:

  • 【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)
  • Visual Studio Code
  • 自适应移动平均(Adaptive Moving Average, AMA)
  • Unity UI 性能优化--Sprite 篇
  • erase-remove idiom介绍
  • EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案
  • 学习资料搜集-ARMv8 cache 操作
  • 704. 二分查找 (力扣)
  • 实践深度学习:构建一个简单的图像分类器
  • ORACLE 缺失 OracleDBConsoleorcl服务导致https://xxx:port/em 不能访问
  • 道可云人工智能每日资讯|北京农业人工智能与机器人研究院揭牌
  • 会议效率低下,应该怎么办
  • Linux 与 Windows:哪个操作系统适合你?
  • 飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程
  • 硬件工程师笔记——555定时器应用Multisim电路仿真实验汇总
  • React 基础语法
  • MySQL关系型数据库学习
  • Ubuntu24.04.2 + kubectl1.33.1 + containerdv1.7.27 + calicov3.30.0
  • C++ set数据插入、set数据查找、set数据删除、set数据统计、set排序规则、代码练习1、2
  • 【C/C++】template 入门到高阶简单大纲
  • rabbitMQ初入门
  • LangChain操作指南
  • 三、kafka消费的全流程
  • 6月2日day43打卡
  • 安全大模型的思考
  • 每日算法 -【Swift 算法】查找字符串数组中的最长公共前缀
  • 婚恋小程序直播系统框架搭建
  • VBA模拟进度条
  • 飞书常用功能(留档)
  • Dockerfile 使用多阶段构建(build 阶段 → release 阶段)后端配置