代码随想录算法训练营第55天 | 392.判断子序列, 115.不同的子序列
392.判断子序列
题目
给定字符串s和t, 判断t是否为s的子序列.
题目分析
动态规划五部曲:
确定dp数组及下标的含义
dp[i][j]表示以下标i-1为结尾的s, 和以下标j-1为结尾的t, 相同子序列长度为dp[i][j].
确定递推公式
如果在t中一个字符在s中也出现了, 那么就要在dp[i-1][j-1]的基础上+1; 如果不匹配, 则继续沿用dp[i][j-1]的结果.
dp数组的初始化
i==0和j==0的部分都要初始化为0.
遍历顺序
外层for循环遍历s的字符, 内层for循环遍历t的字符.
题解
1 |
|
115.不同的子序列
题目
给定一个字符串s和一个字符串t, 计算s的子序列中t出现的次数.
题目分析
动态规划五部曲:
确定dp数组及下标的含义
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]
确定递推公式
1
2
3
4
5if (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];
}dp数组的初始化
1
2vector<vector<long long>> dp(s.size() + 1, vector<long long>(t.size() + 1));
for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;遍历顺序
外层for循环遍历s的字符, 内层for循环遍历t的字符
题解
1 |
|
代码随想录算法训练营第55天 | 392.判断子序列, 115.不同的子序列