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
.
参考:http://blog.youkuaiyun.com/abcbc/article/details/8978146
自己已经推到近在咫尺,但是最终还是错了。
虽然近在咫尺,但是说明了思路还是有问题。
我推着推着发现和最大m子段问题的递推略类似,但是
"aabb" "ab"
r a b b b i t
1 1 1 1 1 1 1 1
r 0 1 1 1 1 1 1 1
a 0 0 1 1 1 1 1 1
b 0 0 0 1 2 3 3 3
b 0 0 0 0 1 3 3 3
i 0 0 0 0 0 0 3 3
t 0 0 0 0 0 0 0 3
class Solution {
public:
int numDistinct(string s, string t) {
int m=t.size();
int n=s.size();
s.insert(s.begin(),'#');
t.insert(t.begin(),'#');
int dp[m+1][n+1];
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int j=1;j<=n;j++) dp[0][j]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(t[i]!=s[j])
dp[i][j]=dp[i][j-1];
else{
//递推公式如此简单...
dp[i][j]=dp[i][j-1]+dp[i-1][j-1];
// if(i==j) dp[i][j]=dp[i-1][j-1];
// else{
// int maxV=dp[i-1][i];
// for(int k=i;k<j;k++)
// maxV=max(maxV,dp[i-1][k]);
// if(dp[i][j-1]>0)
// dp[i][j]=max(maxV+1,dp[i][j-1]+1);
// else
// dp[i][j]=max(maxV,dp[i][j-1]+1);
// }
}
}
}
// for(int i=1;i<=m;i++){
// for(int j=1;j<=n;j++)
// printf("%d ",dp[i][j]);
// printf("\n");
// }
// printf("\n");
return dp[m][n];
}
};