LeetCode(115) Distinct Subsequences(动态规划)

来源:互联网 发布:收货人 余杭嘉云淘宝 编辑:程序博客网 时间:2024/06/05 15:49
  • 刷题地址
    https://leetcode.com/problems/distinct-subsequences/#/description

  • 转载
    http://blog.csdn.net/feliciafay/article/details/42959119

dp[i][j]的含义与变化

表示T的从0开始长度为i的子串和S的从0开始长度为j的子串的匹配的个数。

  • t[i-1] 与 s[j-1] 不相等
    则 dp[i][j] = dp[i][j-1],就是不能使用S的最后一个字符

  • t[i-1] 与 s[j-1] 相等
    那么,可以自己选择是否使用S的最后一个字符
    使用: dp[i-1][j-1]匹配好,然后T最后字符和S最后字符匹配。
    不使用,就类似 t[i-1]与s[j-1]不等的情况。

AC

class Solution {public:    int numDistinct(string s, string t) {        int sLen = s.size();        int tLen = t.size();        vector<vector<int>> dp(tLen + 1, vector<int>(sLen+1));        for(int j =0; j <= sLen; j ++)        {            dp[0][j] = 1;        }        for(int i = 1; i <= tLen; i ++)        {            dp[i][0] = 0;        }        for(int i = 1; i <= tLen; i ++)        {            for(int j = 1; j <= sLen; j ++)            {                dp[i][j] = dp[i][j-1];                if(t[i-1] == s[j-1])                {                    dp[i][j] += dp[i-1][j-1];                }            }        }        return dp[tLen][sLen];    }};