LeetCode-115-Distinct Subsequences
阿新 • • 發佈:2019-02-15
position tco xpl rac 算法 || ++ i++ not is a subsequence of
算法描述:
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"
"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