Given a string S and a string T, count the number of distinct subsequences of T in S.
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).
Here is an example:
S = "rabbbit"
, T = "rabbit"
Return 3
.
动态规划,设dp[i][j]是从字符串S[0...i]中删除几个字符得到字符串T[0...j]的不同的删除方法种类,有上面递归的分析可知,动态规划方程如下
- 如果S[i] = T[j], dp[i][j] = dp[i-1][j-1]+dp[i-1][j]
- 如果S[i] 不等于 T[j], dp[i][j] = dp[i-1][j]
- 初始条件:当T为空字符串时,从任意的S删除几个字符得到T的方法为1
class Solution {
public:
int numDistinct(string S, string T) {
int lenS = S.size();
int lenT = T.size();
if(lenS == 0)
return 0;
else if(lenT == 0)
return 1;
vector<vector<int> > dp(lenS+1,vector<int>(lenT+1,0));
for(int i=0;i<=lenS;i++)
dp[i][0] = 1;
for(int i=1;i<=lenS;i++) {
for(int j=1;j<=lenT;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[lenS][lenT];
}
};