版权声明:本文为博主原创文章,未经博主许可允许转载。 https://blog.csdn.net/qq_29600137/article/details/89460775
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
Example 2:
Input: S ="babgbag"
, T ="bag" Output: 5
题目大意:
找出S中能够组成T的个数。
解题思路:
动态规划,每个位置需要考虑其前一个位置的组合方式的多少。如果S中的字符与T中的字符相同,则需要其加上原先的组合,否则只需要等于上一个T中字符所产生的组合数。
注:最近好像更新了数据,表示中间的变量可能超出int。
class Solution {
public:
int numDistinct(string s, string t) {
int len1 = s.length();
int len2 = t.length();
if(len1 == 0 || len2 == 0){
return 0;
}
vector<vector<long long int>> dp(len1 + 1, vector<long long int>(len2 + 1, 0));
dp[0][0] = 1;
for(int i = 1; i <= len1; ++i){
dp[i][0] = 1;
for(int j = 1; j <= i && j <= len2; ++j){
dp[i][j] = dp[i - 1][j];
if(s[i - 1] == t[j - 1]){
dp[i][j] += dp[i - 1][j - 1];
}
}
}
return dp[len1][len2];
}
};