题目描述
Given a string S and a string T, count the number of distinct subsequences of S which equals T.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ACE” is a subsequence of “ABCDE” while “AEC” is not).
Example 1:
Input: S = "rabbbit", T = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
Example 2:
Input: S = "babgbag", T = "bag"
Output: 5
Explanation:
As shown below, there are 5 ways you can generate "bag" from S.
(The caret symbol ^ means the chosen letters)
babgbag
^^ ^
babgbag
^^ ^
babgbag
^ ^^
babgbag
^ ^^
babgbag
^^^
思路
dp[i][j]表示S的前i个字符有T的前j个字符表示的子串 的子序列的个数。
dp[i][j] 由 dp[i-1][j-1]和dp[i-1][j]两个子问题决定。
代码
class Solution {
public:
int numDistinct(string s, string t) {
int ns = s.length();
int nt = t.length();
if (ns == 0 || ns < nt) return 0;
vector<vector<long long>> dp(ns+1, vector<long long>(nt+1, 0));
dp[0][0] = (s[0] == t[0] ? 1 : 0);
for (int i=1; i<ns; ++i) {
dp[i][0] = dp[i-1][0] + (s[i] == t[0] ? 1 : 0);
}
for (int j=1; j<nt; ++j) {
for (int i=j; i<ns; ++i) {
if (t[j] == s[i]) {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[ns-1][nt-1];
}
};
直觉还真是挺重要的…