链接:http://www.lintcode.com/zh-cn/problem/distinct-subsequences/
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出S = "rabbbit", T = "rabbit"
返回 3
无论S的字符与T的字符是否匹配,dp[i][j]=dp[i-1][j].也就是说,假设S已经匹配了i-1个字符,T已经匹配了j个字符,得到匹配个数为dp[i-1][j]。现在无论S的第i个字符是否与T的第j个字符匹配(即S[i-1]是否与T[j-1]匹配),匹配的个数至少是dp[i-1][j] 。此外,当S[i-1]==T[j-1]时,即S的第i个字符与T的第j个字符匹配,我们可以让S[i-1]与T[j-1]去匹配,即匹配个数加上dp[i-1][j-1]。
class Solution {
public:
/*
* @param : A string
* @param : A string
* @return: Count the number of distinct subsequences
*/
int numDistinct(string S, string T) {
vector<vector<int>> dp(S.length()+1,vector<int>(T.length()+1,0));
for(int i=0;i<=S.length();i++)
{
dp[i][0]=1;
}
for(int i=1;i<=S.length();i++)
{
for(int j=1;j<=T.length();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[S.length()][T.length()];
}
};