动态规划
一、判断子序列
和之前的公共子序列相同,增加一个判断序列长度是否等于字串长度的操作即可
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。
学习资料:《代码随想录》。