美文网首页动态规划
不同的子序列

不同的子序列

作者: 杰米 | 来源:发表于2016-09-02 12:23 被阅读83次

给出字符串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]后符合条件个数

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

相关文章

  • 不同的子序列

    给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的...

  • 不同的子序列

    dp存储该点含之前的所有子序列匹配的解个数。首先对第一列初始化,先确定第一个是否匹配然后再从第二位根据dp[0][...

  • 最大公共子序列(LCS)

    子序列 子序列不要求字符连续(这与串不同) 公共子序列 两个字符串中的相同的子序列 最大公共子序列的例子字符串 X...

  • LintCode 不同的子序列

    给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的...

  • Leetcode 不同的子序列

    题目描述 leecode第115题:不同的子序列[https://leetcode-cn.com/problems...

  • 最长公共子序列问题解析

    问题解读 最长公共子序列问题,就是找出两个字符串中,存在的最长的子序列 什么是子序列呢?子序列不同于公共子串,子串...

  • 115. 不同的子序列

    题目描述 distinct-subsequences 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中...

  • 115. 不同的子序列

    题目描述 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。一个字符串的一个子序列是指...

  • 115. 不同的子序列

    给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指,通过删...

  • 115. 不同的子序列

    给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删...

网友评论

    本文标题: 不同的子序列

    本文链接:https://www.haomeiwen.com/subject/lwwhettx.html