115. Distinct Subsequences

Posted 小河沟大河沟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了115. Distinct Subsequences相关的知识,希望对你有一定的参考价值。

欢迎fork and star:Nowcoder-Repository-github

115. Distinct Subsequences

题目

 Given a string S and a string T, count the number of distinct subsequences of S which equals T.

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. 

解析

  • 此题花费很多时间,对递推公式理解不清楚,用一维表示减少空间
  • 对比最大公共子序列和子串
//115. Distinct Subsequences
class Solution_115 {
public:

    int numDistinct(string S, string T) { //母串和子串匹配的次数

        int lenx = T.size(); //子串
        int leny = S.size(); //母串
        if (lenx==0||leny==0)
        {
            return 0;
        }

        vector<vector<int> > dp(leny + 1, vector<int>(lenx + 1, 0));
        for (int i = 0; i <= leny;i++) //遍历母串
        {
            for (int j = 0; j <= lenx;j++) //遍历子串
            {
                if (j==0)
                {
                    dp[i][j] = 1; //当子串长度为0时,所有次数都是1
                    continue;
                }
                if (i>=1&&j>=1)
                {
                    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[leny][lenx];
    }

    int numDistinct2(string s, string t) {
        vector<int> match(t.size() + 1);
        match[0] = 1;
        for (int i = 0; i<s.size(); i++)
        for (int j = t.size(); j>0; j--)
            match[j] += (t[j - 1] == s[i] ? match[j - 1] : 0);
        return match[t.size()];
    }


    int numDistinct1(string S, string T) {  //bug.计算最长公共子序列
    //测试用例:
    //  "ddd", "dd"
    //  对应输出应该为:3
    //  你的输出为 : 2
        int lenx = S.size();
        int leny = T.size();
        if (lenx==0||leny==0)
        {
            return 0;
        }

        vector<vector<int>> vecs(leny+1, vector<int>(lenx+1, 0));
        for (int i = 1; i <= T.size();i++) //行
        {
            for (int j = 1; j <=lenx;j++) //列
            {
                if (S[j-1]==T[i-1])
                {
                    vecs[i][j] = vecs[i-1][j - 1] + 1;
                }
                else
                {
                    vecs[i][j] = max(vecs[i - 1][j], vecs[i][j - 1]);
                }
            }
        }

        int cnt = 0;
        if (vecs[leny][lenx] > 0){
            cnt++;
            for (int i = lenx - 1; i > 0; i--)
            {
                if (vecs[leny][i] == vecs[leny][lenx])
                {
                    cnt++;
                }
            }
        }

        return cnt;
    }
};

题目来源

以上是关于115. Distinct Subsequences的主要内容,如果未能解决你的问题,请参考以下文章

115. Distinct Subsequences

115. Distinct Subsequences

115. Distinct Subsequences(js)

leetcode1081. Smallest Subsequence of Distinct Characters

算法: 不同的子序列115. Distinct Subsequences

115. Distinct Subsequences