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] = dp[i][j - 1]
ift[i - 1] != s[j - 1]
;dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1]
ift[i - 1] == s[j - 1]
;
可以看出i,j都要从1开始,所以如何处理i,j等于0的问题就是一个小难点。
dp[i][j]是s的前i个字符可以形成的包含t的前j字符的子串的个数,如果s[i-1]==t[j-1],则dp[i][j] 的个数等于s中前i-1个字符可以形成的包含t中前j-1个字符的子串个数+s前i个字符可以形成的包含t的前j个字符的子串个数。
所以当j==1,如果s[i-1]==t[j-1],dp[i][j] = dp[i-1][j] + 1;
所以将dp[i][0] = 1;
class Solution {
public:
int numDistinct(string s, string t)
{
int len1 = s.size();
int len2 = t.size();
vector<long> dp(len2+1,0);
dp[0] = 1;
for(int i = 1; i <= len1; ++i)
{
for(int j = len2; j >= 1; --j)
{
if(s[i-1] == t[j-1]) dp[j] = dp[j] + dp[j-1];
}
}
return dp[len2];
}
};