不同的子序列-LintCode

来源:互联网 发布:python创建临时文件夹 编辑:程序博客网 时间:2024/05/18 21:41

给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例:
给出S = “rabbbit”, T = “rabbit”
返回 3
思想:
dp[i][j]表示字符串S的前i个字符中,T的前j个字符出现的次数。
易得:
dp[i][0]=1,对于空串出现次数为1;
dp[0][j]=0,若S为空,则T中字符串出现次数为0(j!=0);
dp[i][j]=dp[i-1][j]+(S[i-1]==T[j-1]?dp[i-1][j-1]:0),假设S已经匹配了j - 1个字符,得到匹配个数为dp[i][j - 1]。目前匹配的个数至少是dp[i][j - 1]。如果S[i]==T[j],则当前这个字母为可选择项,所以变换方法等于保留这个字母的变换方法加上不用这个字母的变换方法。

#ifndef C118_H#define C118_H#include<iostream>#include<string>#include<vector>using namespace std;class Solution {public:    /**    * @param S, T: Two string.    * @return: Count the number of distinct subsequences    */    int numDistinct(string &S, string &T) {        // write your code here        int m = S.size();        int n = T.size();        vector<vector<int>> dp(m + 1, vector<int>(n + 1));        for (int i = 0; i <= m; ++i)            dp[i][0] = 1;        for (int j = 1; j <= n; ++j)            dp[0][j] = 0;        for (int i = 1; i <= m; ++i)        {            for (int j = 1; j <= n; ++j)            {                dp[i][j] = dp[i - 1][j] + (S[i - 1] == T[j - 1] ? dp[i - 1][j - 1] : 0);            }        }        return dp[m][n];    }};#endif