LeetCode:115. Distinct Subsequences

在这里插入图片描述
写它的原因是它的状态方程比较难写。明白了之后是比较容易的,但是当时确实没有想出来。

class Solution {
public:
    int numDistinct(string s, string t) {
        int sLen = s.size(), tLen = t.size();
        if (tLen > sLen)
            return 0;
        vector<vector<long long>> dp(sLen, vector<long long>(tLen, 0));
        dp[0][0] = s[0] == t[0] ? 1 : 0;
        int cnt = dp[0][0];
        for (int i = 1; i < sLen; ++i) {
            if (s[i] == t[0])
                dp[i][0] = ++cnt;
            else
                dp[i][0] = dp[i-1][0];
        }
        for (int i = 1; i < sLen; ++i)
            for (int j = 1; j < tLen; ++j) {
                if (s[i] == t[j])
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                else
                    dp[i][j] = dp[i-1][j];
            }
        return dp.back().back();
    }
};
//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])
//否则dp[i][j] = dp[i-1][j](没有办法,只能不用)

然后使用多一行一列来使编码更简单:

class Solution {
public:
    int numDistinct(string s, string t) {
        int sLen = s.size(), tLen = t.size();
        if (tLen > sLen)
            return 0;
        vector<vector<long long>> dp(sLen+1, vector<long long>(tLen+1, 0));
        for (int i = 0; i <= sLen; ++i)
            dp[i][0] = 1;//此时j为0,问s构成一个空串的方式,肯定为1种
        for (int i = 1; i <= sLen; ++i)
            for (int j = 1; j <= tLen; ++j)
                dp[i][j] = dp[i-1][j] + (s[i-1] == t[j-1]? dp[i-1][j-1] : 0);
        return dp.back().back();
    }
};
posted @ 2019-08-27 21:11  于老师的父亲王老爷子  阅读(23)  评论(0编辑  收藏  举报