不同的子序列

给出字符串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>dp(tLength+1,vector(sLength+1,0)) ;
        for(int i = 0;i < sLength+1;i++) {
            dp[0][i] = 1;
        }
        for(int i = 1; i

参考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]后符合条件个数

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

你可能感兴趣的:(不同的子序列)