不同的子序列

给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。

子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例
给出S = "rabbbit", T = "rabbit"

返回 3

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 tLength = T.size();
        int sLength = S.size();
        vector<vector<int>>dp(tLength+1,vector<int>(sLength+1,0)) ;
        for(int i = 0;i < sLength+1;i++) {
            dp[0][i] = 1;
        }
        for(int i = 1; i<tLength+1;i++){
            for(int j=1; j<sLength+1;j++) {
                //之前在这里写成S[j-1] == T[i-1]导致花了很多时间,动态规划的状态方程和操作字符安串的下标一般是不对称的!!!
                if(S[j-1] == T[i-1]) {
                    dp[i][j] = dp[i][j-1] + dp[i-1][j-1];
                } else {
                    dp[i][j] = dp[i][j-1];
                }
              //  dp[i][j] = ((S[j] == T[i])?(dp[i-1][j-1]):0) + dp[i][j-1];
            }
        }
        return dp[tLength][sLength];
    }
};

参考LeetCode
解释
dp[i][j] = dp[i][j-1] + dp[i-1][j-1];

dp[i][j] 为字符串S(0,i-1)到T(0,j-1)的S的子序列中T出现的个数
当S[j-1] == T[i-1]

  • dp[i][j-1]表示前面符合条件的子串
  • dp[i-1][j-1]表示加上字符s[i-1]后符合条件个数

动态规划的状态方程和操作字符安串的下标一般是不对称的!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,867评论 0 18
  • 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的...
    Arnold134777阅读 4,179评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • 分治方法 将问题划分成互不相交的子问题 递归地求解子问题 将子问题的解组合起来 动态规划(两个要素:最优子结构、子...
    superlj666阅读 3,508评论 0 0
  • 明天的你会感谢今天的你 ————————————分割线 晚上,8点11分。 QQ消息。 “走吧?” “嗯,好的。”...
    沂尾鱼阅读 1,387评论 0 0

友情链接更多精彩内容