392. 判断子序列
注释部分是我自己写出来的,就是边界条件比较复杂,dp[i]定义为到t[i]为止的字符串的匹配最大值,因此dp数组是非递减的。
代码随想录的版本是定义二维dp,如果当前值相等则可以从左上加一推出,否则只可以从上方推出。
class Solution {
public:
bool isSubsequence(string s, string t) {
// if (s.size() == 0 && t.size() == 0) return true;
// if (s.size() != 0 && t.size() == 0) return false;
// if (s.size() == 0 && t.size() != 0) return true;
// vector<int> dp(t.size(), 0);
// int j = 0;
// for (int i = 0; i < t.size(); i++) {
// if (s[j] == t[i]) {
// j++;
// dp[i] = j;
// }
// else if (i>0){
// dp[i] = dp[i-1];
// }
// }
// if (dp[t.size()-1] == s.size()) {
// return true;
// }
// return false;
// }
// 代码随想录的版本
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][j-1], dp[i-1][j]);
}
}
if (dp[s.size()][t.size()] == s.size()) return true;
return false;
}
};
115. 不同的子序列
困难题,第一次做,不太会。
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()];
}
};