392.判断子序列
给定字符串 s 和 t,判断 s 是否为 t 的子序列。注意:子序列不要求连续,但是要求各个元素出现的前后顺序相同。判断一个字符串是否为另一个字符串的子序列,和 1143.最长公共子序列,判断两个字符串的最长公共子序列 的思路相同,如果字符串 s 和 t 的最长公共子序列的长度不等于字符串 s 的长度,就说明 s 不为 t 的子序列。
class Solution {
public:
bool isSubsequence(string s, string t) {
auto dp = vector<vector<int>> (s.size() + 1, vector<int> (t.size() + 1, 0));
int result = 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];
result = max(result, dp[i][j]);
}
}
return result == s.size() ? true : 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));
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()];
}
};