392 判断子序列
思路:算法使用一个二维矩阵dp,其中dp[i][j]表示s的前i个字符和t的前j个字符之间最长公共子序列的长度。基本情况为dp [0] [j] = dp [i] [0] = 0,因为空字符串没有子序列。
算法然后对这两个字符串进行迭代,通过比较s和t的当前字符填充dp矩阵。如果字符匹配,则最长公共子序列的长度从前一个字符的最长公共子序列长度增加1。否则,最长公共子序列的长度与t中前一个字符的最长公共子序列长度相同。
最后,如果s和t之间的最长公共子序列的长度等于s的长度,则函数返回true,表示s是t的子序列;否则返回false。
1.动态规划
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] = dp[i][j - 1];
}
}
if(dp[s.size()][t.size()] == s.size()) return true;
return false;
}
};
115 不同的子序列
思路:算法使用一个二维矩阵 dp,其中 dp[i][j] 表示 s 的前 i 个字符和 t 的前 j 个字符之间相等的子序列数量。在初始化时,将 dp[0][j] 设置为 1,因为 t 的空子序列在 s 中均为相等子序列,将 dp[i][0] 设置为 0,因为空字符串无法与 t 相等。
然后,算法对 s 和 t 进行迭代,填充 dp 矩阵。如果 s[i-1] == t[j-1],表示 s 的第 i 个字符可以与 t 的第 j 个字符匹配,则将 dp[i][j] 设为 s 的前 i-1 个字符中与 t 的前 j-1 个字符相等的子序列数量加上 s 的前 i-1 个字符中与 t 的前 j 个字符相等的子序列数量。否则,将 dp[i][j] 设为 s 的前 i-1 个字符中与 t 的前 j 个字符相等的子序列数量。
最后,算法返回 dp[s.size()][t.size()],即 s 的所有子序列中与 t 相等的子序列数量。
1.动态规划
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] + dp[i - 1][j - 1];
else dp[i][j] = dp[i - 1][j];
}
}
return dp[s.size()][t.size()];
}
};