1. 程式人生 > >[lintcode]118. 不同的子序列

[lintcode]118. 不同的子序列

連結: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個字元,得到匹配個數為dp[i-1][j].現在無論如何S[i]是否與T[j]匹配,匹配的個數至少是dp[i-1][j] .此外,當S[i]==T[j]時,我們可以讓S[i-1]與T[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()];
    }
};