动态规划

不同的子序列

2016-09-02  本文已影响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]

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

上一篇 下一篇

猜你喜欢

热点阅读