Link:
题目要求
给定字符串s和t,求s的子序列中t出现的总次数
核心算法和原理
- dp数组[i, j]定义为s[i…]中出现t[j…]的子序列的数量
- 从i这个维度向下线性遍历
- 解释下面那项:当我s[i]和t[j]相同时,我可以把状态转移到匹配成功(i+1, j+1)的情况,也可以不匹配这项,让s[i]前面的字符去匹配t[j],这样穷尽了所有可能
- 很容易压成一维,反着遍历第二层就行
代码
class Solution { public: int numDistinct(string s, string t) { int LL = 1000000007; int ns = s.size(); int nt = t.size(); vector<int> dp(nt + 1, 0); dp[0] = 1; for (int i = 0; i < ns; i++) { for (int j = nt; j >= 1; j--) { if (t[j - 1] == s[i]) { dp[j] = (dp[j] + dp[j - 1]) % LL; } } } return dp[nt]; } };
