动态规划
文章目录
- 一、判断子序列
- 二、不同的子序列
- 总结
一、判断子序列
和之前的公共子序列相同,增加一个判断序列长度是否等于字串长度的操作即可
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] = max (dp[i-1][j], dp[i][j-1]);}}}if (s.size() == dp[s.size()][t.size()]) return true;return false;}
};
二、不同的子序列
分为匹配和不匹配两种情况,如果匹配则当前情况加上之前已经匹配的情况,不匹配则获取之前的已经匹配的情况
class Solution {
public:int numDistinct(string s, string t) {//vector<vector<uint64_t>>dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0));//初始化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()];}
};
总结
不同的子序列有点绕
学习时间90min。
学习资料:《代码随想录》。