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
^^^
Accepted
98,590
Submissions
287,652
class Solution {
public:
int numDistinct(string s, string t) {
int m=t.length();
int n=s.length();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for(int j=0;j<=n;j++)
dp[0][j]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j]=dp[i][j-1]+(t[i-1]==s[j-1]?dp[i-1][j-1]:0);
return dp[m][n];
}
};
此題為hard難度,其解法類似與算法課上的找最長字串,而這裡是找在S中有幾個T子串。實際上就是用DP方法去維護一個二維數組,這個數組的的dp[i][j]就是對于t[0~i]和s[0~j]的此題的解。(也就是在此時s中有多少個t子串)。然後通過動态規劃的化解可以知道,dp[i][j]=dp[i][j-1](如果兩個串最後一個值不相等),dp[i][j]=dp[i-1][j-1]+dp[i][j-1](如果最後一個值相等)再根據初始值和邊值條件,對數組進行周遊指派,以得最後的解。