1、Leetcode392判断子序列
题目链接:392判断子序列
本题与1143最长公共子序列有一点不一样,最长公共子序列求两个字符串的最长公共子序列的长度,本题判断s是否为t的子序列。即t的长度是大于等于s的。
1、确定dp数组及下标含义
dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
2、确定递推公式
if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;
if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,dp[i][j] = dp[i][j - 1];
本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。
3、初始化
全部初始化为0。
4、遍历顺序
从前向后,从上到下。
5、举例推导。
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(); i++)
{
for (int j = 1; j <= t.size(); j++)
{
if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else
{
dp[i][j] = dp[i][j - 1];
}
}
}
if (dp[s.size()][t.size()] == s.size()) return true;
else
{
return false;
}
}
};
2、Leetcode115不同的子序列
题目链接:115不同的子序列
1、确定dp数组(dp table)以及下标的含义
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
2、确定递推公式
当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。
例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。
当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。
所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配,即:dp[i - 1][j];
3、初始化
dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。
dp[0][j]一定都是0,s如论如何也变成不了t。
dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。
4、遍历顺序
从dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] 和 dp[i][j] = dp[i - 1][j] 可以看出 dp[i][j] 从左上方和正上方推出来,遍历的时候一定是从上到下,从左到右。文章来源:https://www.toymoban.com/news/detail-559275.html
5、举例推导文章来源地址https://www.toymoban.com/news/detail-559275.html
class Solution {
public:
int numDistinct(string s, string t) {
vector<vector<uint64_t>> dp(s.size()+ 1 , vector<uint64_t>(t.size() + 1));
for (int i = 0; i < s.size(); i++) dp[i][0] = 1;
for (int j = 1; j < t.size(); j++) dp[0][j] = 0;
for (int i = 1; i <= s.size(); i++)
{
for (int j = 1; j <= t.size(); j++)
{
if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
else
{
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[s.size()][t.size()];
}
};
到了这里,关于代码随想录刷题第55天|Leetcode392判断子序列、Leetcode115不同的子序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!