您的位置:首页 > 产品设计 > UI/UE

115. Distinct Subsequences dp算法

2016-05-14 20:16 441 查看
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
.

Subscribe to see which companies asked this question

分析:

此题可以换一个说法,删除s中的元素变成T,有几种不同的删除方法,即可以产生多少种子序列。

定义二维数组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-1][j-1]是保留,dp[i-1][j]是抛弃。
如果S[i]!=T[j],那么dp[i][j] = dp[i-1][j],意思是如果当前字符不等,那么就只能抛弃当前这个字符。
dp[i][0]=1

代码:

class Solution {

public:

    int numDistinct(string s, string t) {

        if(s.size()==0||t.size()==0||s.size()<t.size()) return 0;

        vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));

        for(int i=0;i<s.size();++i) dp[i][0]=1;

        

        for(int i=1;i<=s.size();++i)

        for(int j=1;j<=t.size();++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.size()][t.size()];

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划