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

leetcode 1143. Longest Common Subsequence

目录

题目描述

第一步,明确并理解dp数组及下标的含义

第二步,分析明确并理解递推公式

第三步,理解dp数组如何初始化

第四步,理解遍历顺序

代码


题目描述

这道题和第718题的区别就是,本题求的是最长公共子序列的长度,第718题求的是最长公共子数组的长度。子序列可以不是连续的,子数组则必须是连续的。两道题的分析方法是一样的。

第一步,明确并理解dp数组及下标的含义

用下标(i-1)遍历text1数组,用下标(j-1)遍历text2数组。

        int len1 = text1.size();

        int len2 = text2.size();

        //i的取值范围是[1,len1]

        //j的取值范围是[1,len2]

        //dp[i][j]表示字符串text1[0,i-1]和字符串text2[0,j-1]的最长公共【子序列】的长度

按照这样的定义,dp[len1][len2]就是答案。本题dp数组的含义与第718题不一样。

第二步,分析明确并理解递推公式

 //当i!=0 && j!=0时,分两种情况:

 //如果text1[i-1]==text2[j-1],dp[i][j]=dp[i-1][j-1]+1

 //如果text1[i-1]!=text2[j-1],dp[i][j]应该为dp[i-1][j]和dp[i][j-1]中较大的一个

第三步,理解dp数组如何初始化

        //dp[0][j]表示text1为空,显然此时text1和text2没有公共【子序列】,dp[0][j]都应该初始化为0

        //dp[i][0]表示text2为空,显然此时text1和text2没有公共【子序列】,dp[i][0]都应该初始化为0

        //当i!=0 && j!=0时,分两种情况:

        //如果text1[i-1]==text2[j-1],dp[i][j]=dp[i-1][j-1]+1,即后面的dp[i][j]由前面的dp[i-1][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。

        //如果text1[i-1]!=text2[j-1],dp[i][j]应该为dp[i-1][j]和dp[i][j-1]中较大的一个,后面的dp[i][j]由前面的dp[i-1][j]或者前面的dp[i][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。

第四步,理解遍历顺序

由递推公式,可知i和j都应该从小到大遍历。注意i的取值范围是[1,len1],j的取值范围是[1,len2]。

代码

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int len1 = text1.size();int len2 = text2.size();//i的取值范围是[1,len1]//j的取值范围是[1,len2]//dp[i][j]表示字符串text1[0,i-1]和字符串text2[0,j-1]的最长公共【子序列】的长度//dp[0][j]表示text1为空,显然此时text1和text2没有公共【子序列】,dp[0][j]都应该初始化为0//dp[i][0]表示text2为空,显然此时text1和text2没有公共【子序列】,dp[i][0]都应该初始化为0//当i!=0 && j!=0时,分两种情况://如果text1[i-1]==text2[j-1],dp[i][j]=dp[i-1][j-1]+1,即后面的dp[i][j]由前面的dp[i-1][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。//如果text1[i-1]!=text2[j-1],dp[i][j]应该为dp[i-1][j]和dp[i][j-1]中较大的一个,后面的dp[i][j]由前面的dp[i-1][j]或者前面的dp[i][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));for(int i = 1;i <= len1;i++){for(int j =1;j <= len2;j++){if(text1[i-1] == text2[j-1]){dp[i][j] = dp[i-1][j-1] +1;}else{dp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}}return dp[len1][len2];}
};
http://www.xdnf.cn/news/765.html

相关文章:

  • 利用OLED打印调试信息: 控制PC13指示灯点灯的实验
  • Kubernetes相关的名词解释Dashboard界面(6)
  • CentOS stream 中部署Zabbix RPM软件包公钥验证错误
  • Java中订阅消费模式(发布-订阅模式)和观察者模式的区别
  • 进程管理,关闭进程
  • Linux进程管理:进程查看与控制核心指南
  • 硬件电路(25)-过温保护器件ksd9700温控开关
  • 命令行参数·环境变量·进程地址空间(linux+C/C++)
  • 位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
  • Web前端:常用的布局属性
  • 聊一聊接口测试后垃圾数据如何清理?
  • 【Sa-Token】学习笔记05 - 踢人下线源码解析
  • Few-shot medical image segmentation with high-fidelity prototypes 论文总结
  • 计算机网络综合实验指南
  • 【Rust 精进之路之第14篇-结构体 Struct】定义、实例化与方法:封装数据与行为
  • 【操作系统原理06】虚拟存储器
  • CLion编译器中配置ARM嵌入式开发环境教程
  • 面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?
  • ThreadLocal - 原理与应用场景详解
  • 蓝桥杯 二进制问题 刷题笔记
  • 一个旅行攻略需要调用多少个MCP的服务?
  • 松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)
  • 网工_DHCP协议
  • AI与思维模型【67】——元认知
  • 使用docker任意系统编译opengauss
  • Vue.js 入门教程
  • Spring 微服务解决了单体架构的哪些痛点?
  • 分布式入门
  • 七段码 路径压缩 并查集 dfs
  • 思维题专题