115:Distinct Subsequences【DP】【字符串】

来源:互联网 发布:苏州网站网络推广公司 编辑:程序博客网 时间:2024/05/16 16:11

题目链接:click~

/*题意:给出两个字符串S和T,求T在S中的子串数。(可以删除S中的字符,        但不能改变原来的相对顺序,共有多少删除方法变成T) *//** *思路:DP,d[i][j]表示S[0,...,i]到T[0,...,j]有多少种转换方式 *      可以想象成二维地图的走法问题,那么问题转为从左上角只能走对角(匹配)             或者往下(删除字符),到右下角一共有多少种走法。 *      d[i][0]初始化为1的含义是:任何长度的S,如果转换为空串,那就只有删除全部字符这1种方式。 *      当S[i-1]==T[j-1],可以从d[i-1][j-1]走对角到达d[i][j](S[i-1]匹配T[j-1])             此外还可以从d[i-1][j]往下到达d[i][j](删除S[i-1]) *      当S[i-1]!=T[j-1],只能从d[i-1][j]往下到达d[i][j](删除S[i-1]) *//*样例    r a b b i t  1 0 0 0 0 0 0r 1 1 0 0 0 0 0a 1 1 1 0 0 0 0b 1 1 1 1 0 0 0b 1 1 1 2 1 0 0b 1 1 1 3 3 0 0i 1 1 1 3 3 3 0t 1 1 1 3 3 3 3*/class Solution {public:    int numDistinct(string S, string T) {        int n = S.size();        int m = T.size();        vector<vector<int> > d(n+1,vector<int>(m+1,0));        for(int i = 0; i <= n; i ++)            d[i][0] = 1;        for(int j = 1; j <= m; j ++)            d[0][j] = 0;        for(int i = 1; i <= n; i ++) {            for(int j = 1; j <= m; j++) {                if(S[i-1] == T[j-1])                    d[i][j] = d[i-1][j] + d[i-1][j-1];                else                    d[i][j] = d[i-1][j];            }        }        return d[n][m];    }};


0 0
原创粉丝点击