算法Day55 | 392.判断子序列,115.不同的子序列

news/2024/10/17 14:27:58/

Day55

    • 392.判断子序列
    • 115.不同的子序列

392.判断子序列

题目链接:392.判断子序列
1143.最长公共子序列 几乎相同

class Solution {
public:bool isSubsequence(string s, string t) {vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));for (int i = 1; i < s.size() + 1; ++i) {for (int j = 1; j < t.size() + 1; ++j) {dp[i][j] = (s[i - 1] == t[j - 1])? dp[i - 1][j - 1] + 1: dp[i][j - 1];}}return dp.back().back() == s.size();}
};

dp数组压缩至一维,有

class Solution {
public:bool isSubsequence(string s, string t) {vector<int> dp(t.size() + 1, 0);for (int i = 1; i < s.size() + 1; ++i) {int prev = 0;for (int j = 1; j < t.size() + 1; ++j) {int temp = dp[j]; // 保存当前 dp[j] 的值dp[j] = (s[i - 1] == t[j - 1])? prev + 1: max(dp[j], dp[j - 1]);prev = temp; // 更新 prev}}return dp.back() == s.size();}
};

对于每个位置 (i, j),其中 i 代表字符串 s 的索引,j 代表字符串 t 的索引,计算 dp[j] 的值。具体做法如下:

  • 如果 s[i - 1] 等于 t[j - 1],即当前字符匹配,则 dp[j] 的值等于 prev + 1,其中 prev 是上一个位置 (i - 1, j - 1) 的值。
  • 如果 s[i - 1] 不等于 t[j - 1],即当前字符不匹配,则 dp[j] 的值等于 dp[j]dp[j - 1] 中的较大值。dp[j - 1] 是上一行对应位置的值,即(i, j - 1)

为了在计算新值之前保存 dp[j] 的旧值,使用变量 temp


115.不同的子序列

题目链接:115.不同的子序列
可以当做删除s中其他元素,有多少种和t相同的个数。

dp数组 : 以i - 1为结尾的s中有以j - 1为结尾的t的个数为dp[i][j]

递推公式

dp[i][j] = (s[i - 1] == t[j - 1])? dp[i - 1][j - 1] + dp[i - 1][j]: dp[i - 1][j];

dp[i - 1][j - 1] + dp[i - 1][j]

  • dp[i - 1][j - 1] 相当于s变成i - 2结尾,删除了第i - 1个元素
  • dp[i - 1][j]这个情况就是题目中所描述的情况,比如sbaggtbag。可以有sba_gt bag匹配上,dp[i - 1][j - 1]的状态,也可以是sbag_t bag匹配上,就是dp[i - 1][j]的状态。

dp[i - 1][j] 删除s的第i - 1个元素,不考虑第i-1个元素。

由于题目中的st的地位不同(t是子集,s是全集),因此有dp[i - 1][j]状态出现,而没有dp[i][j - 1]状态出现。

初始化
二维数组初始化第一行和第一列。
dp[i][0] = 1 t为空字符在s中有1种,dp[0][j] = 0 ts空字符中有0
上述两个交集:dp[0][0] = 1 空字符t在空字符s中有1

class Solution {
public:int numDistinct(string s, string t) {vector<vector<unsigned/*int会溢出*/>> dp(s.size() + 1, vector<unsigned>(t.size() + 1, 0));for (auto& tmp : dp) {tmp[0] = 1;//初始化dp[i][0]}for (int i = 1; i < s.size() + 1; ++i) {for (int j = 1; j < t.size() + 1; ++j) {dp[i][j] = (s[i - 1] == t[j - 1])? dp[i - 1][j - 1] + dp[i - 1][j]: dp[i - 1][j];}}return dp.back().back();}
};

dp数组压缩为一维数组

class Solution {
public:int numDistinct(string s, string t) {vector<unsigned> dp(t.size() + 1, 0);dp[0] = 1;for (int i = 1; i <= s.size(); i++) {int prev = 1;for (int j = 1; j <= t.size(); j++) {int temp = dp[j];if (s[i - 1] == t[j - 1]) {dp[j] = prev + dp[j];}prev = temp;}}return dp.back();}
};

对于每个字符s[i - 1]t[j - 1],若它们相等,则可以选择将s[i - 1]t[j - 1]匹配,此时,我们需要在s的前i - 1个字符和t的前j - 1个字符中找到不同子序列的个数,即dp[j - 1]。同时,我们还可以选择不将s[i - 1]t[j - 1]匹配,此时,我们需要在s的前i - 1个字符和t的前j个字符中找到不同子序列的个数,即dp[j]。因此,当前字符的不同子序列的个数等于这两种选择的和。

在内层循环中,我们使用prev变量来保存上一次迭代时的dp[j]的值,以便在计算dp[j]时使用。这样可以确保计算当前字符的不同子序列的个数时,使用的是上一次迭代时的值而不是当前迭代时的值。



http://www.ppmy.cn/news/703208.html

相关文章

html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

文章目录 1.功能模板1.1 仿爱奇艺1.2 仿搜狐视频1.3 仿迅雷看看1.4 视频播放1.5 影视公司官网 2.效果和源码2.1 源代码2.2 模板目录 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/131516313 html实现视频网站…

计算机实验英语,一种新的计算机适应色觉试验(英文)

摘要&#xff1a; 目的:提出一种新的计算机适应色觉试验(NCACVT)并且解释它在实际应用中的可靠性和重要性。方法:法-孟二式100色度试验(FM100HT)和Holmgren试验已经被改良并且适应计算机应用。经典的Ishihara假同色法试验方法(IPPT)已被假定是色盲的一个简便的筛选检查工具;因此…

FY20浪潮合作伙伴产品销售IPPS认证-基础产品

大概做了有5-6套&#xff0c;最后考试80分&#xff0c;过了。 把确定正确的答案整理了以下&#xff0c;供大家参考

郁闷,现在才知道alter table ... disable all trigger会使之前对这张表所做的操作提交...

今天由于要对裁片外发收货的的架构做一个调整,所以要对表的数据做一些调整.但由于是直接在数据库后台做,trigger的作用会使更新表的用户变成登陆数据库的用户名,从而改变了原来数据的原貌&#xff0c;于是我就把所有做调整的&#xff33;&#xff31;&#xff2c;语句放到一个脚…

SQLServer触发器禁用与启用

禁用&#xff1a;alter table 表名 disable trigger 触发器名称 执行语句&#xff1a;update 表名 set 列名新数据 where 查询条件 启用&#xff1a;alter table 表名 enable trigger 触发器名称 --------------------------------------------------------------- --禁…

安装 NIST net 的步骤及使用(nistnet-2.0.12b针对linux-2.4.20-8)on RedHat9.0

原本打算直接在已经安装的CentOS 5.0上安装它&#xff0c;可惜花了一天时间来编译内核&#xff0c;配置&#xff0c;设置...最后还是徒劳&#xff0c;不得不决定采用以下方式来完成&#xff01; 一&#xff0e;下载RedHat9.0&#xff1a;http://ftp.redhat.com/pub/redhat/linu…

实例讲解在CentOS 5.0上安装NistNet

……*&%&#xffe5;&#xffe5; //此处省略废话&#xff0c;直接如题 1、 操作系统安装&#xff1a; 经过多次安装测试安装CentOS 5系统&#xff0c;采用完整版光盘安装&#xff0c;因为安装nistnet需要编译内核 2、 下载相关软件包 ◇ linux-2.6.18.8.tar.g…

浅谈增值业务及双向运营支撑平台

引自《广播电视信息》2007.04 1 引言 2006 年是我国城市有线电视数字化发展最快的一年&#xff0c;据统计全国有 25 个城市实现了城区有线电视数字化。在数字化的浪潮下&#xff0c;我国有线电视数字化已经由试点进入全面推广的新阶段&#xff0c;全国数字化改造已进入蓬…