Distinct Subsequences

 

Q:

A:

仍然是dp的思想,定义A[i][j]为T的前i + 1个字符和S的前j + 1个字符的Distinct Subsequences的个数,则有

S[i] == T[j]:  A[i][j] = A[i][j - 1] + A[i - 1][j - 1]

S[i] != T[j]:  A[i][j] = A[i - 1][j - 1]

OK

class Solution {
public:
    int numDistinct(string S, string T) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        /*
        A[i][j] = A[i][j - 1] + A[i - 1][j - 1]
                  A[i][j - 1]
                  */
        int len_s = S.length();
        int len_t = T.length();
        if (S.empty() || T.empty()) return 0;
        vector<int> nums;
        nums.resize(len_s);
        nums[0] = T[0] == S[0] ? 1 : 0;
        for (int i = 1; i < len_s; ++i) {
            if (T[0] == S[i]) {
                nums[i] = nums[i - 1] + 1;
            } else {
                nums[i] = nums[i - 1];
            }
        }
        for (int i = 1; i < len_t; ++i) {
            int pre = nums[0];
            nums[0] = 0;
            for (int j = 1; j < len_s; ++j) {
                int tmp = nums[j];
                if (j < i) {
                    nums[j] = 0;
                    pre = tmp;
                    continue;
                }
                if (S[j] == T[i]) {
                    nums[j] = pre + nums[j - 1];
                } else {
                    nums[j] = nums[j - 1];
                }
                pre = tmp;
            }
        }
        return nums.back();
    }
};

 

posted @ 2013-06-25 23:56  dmthinker  阅读(127)  评论(0)    收藏  举报