class Solution
{
public:
int numDistinct(string s, string t)
{ // 这道题目不同于在s中寻找连续的t的个数,并不能够直接暴力解
// dp[i][j]的含义: 以s[i - 1]结尾的子字符串中,包含有多少个以t[j - 1]结尾的子字符串
vector<vector<unsigned long int>> dp(s.size() + 1, vector<unsigned long int>(t.size() + 1, 0));
for(int i = 0; i <= s.size(); i++)
{
dp[i][0] = 1; // 以s[i]结尾,包含1个空字符串
}
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] + dp[i - 1][j]; // 取s[i - 1]和不取s[i - 1]
}
else
{
dp[i][j] = dp[i - 1][j]; // 模拟删除
}
}
}
return dp[s.size()][t.size()];
}
};
【Leetcode笔记】动态规划-115.不同的子序列
于 2023-12-30 21:15:32 首次发布