算法描述:
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
^^^
解题思路:动态规划题。如果字符s[i-1]和t[j-1]相等,则结果序列分为两种情况,包含当前字符的序列和不包含当前字符的序列。如果不相等,则只有一种情况,即不包含当前字符的序列。空串是任何序列的子序列。
递推公式:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j] if(s[i-1]==t[j-1]);
dp[i][j] = dp[i-1][j] if(s[i-1]!=t[j-1]);
int numDistinct(string s, string t) { if(s.size()==0 || t.size()==0) return 0; vector<vector<long long>> dp(s.size()+1,vector<long long>(t.size()+1,0)); for(int i =0; i <= s.size(); i++) dp[i][0] = 1; 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]; else dp[i][j] = dp[i-1][j]; } } return dp[s.size()][t.size()]; }
LeetCode-115-Distinct Subsequences
原文:https://www.cnblogs.com/nobodywang/p/10385689.html