Distinct Subsequences leetcode

来源:互联网 发布:算法复杂性影响因素 编辑:程序博客网 时间:2024/06/07 07:32

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

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.

动态规划,设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][j] = dp[i-1][j]
  • 初始条件:当T为空字符串时,从任意的S删除几个字符得到T的方法为1
class Solution {public:    int numDistinct(string S, string T) {        int lenS = S.size();        int lenT = T.size();        if(lenS == 0)            return 0;        else if(lenT == 0)            return 1;        vector<vector<int> > dp(lenS+1,vector<int>(lenT+1,0));        for(int i=0;i<=lenS;i++)            dp[i][0] = 1;        for(int i=1;i<=lenS;i++) {            for(int j=1;j<=lenT;j++) {                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[lenS][lenT];    }};



0 0