1. 程式人生 > >Distinct Subsequences(Leetcode)

Distinct Subsequences(Leetcode)

Distinct Subsequences

Given a string S and a string T, count the number of distinct subsequences of S which equals T.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE"

 is a subsequence of "ABCDE" while "AEC" is not).

Here is an example:
S = "rabbbit"T = "rabbit"

Return 3.

解題思路:

動態規劃。用二維陣列v[i][j]表示和T.substr(0, j+1)相等的S.substr(0, i+1)的子序列的個數。

考慮如何得到v[i][j](i, j 大於 0),有兩種情況:

① S[i] == T[j],此時 v[i][j] = v[i-1][j] + v[i-1][j-1]

② S[i] != T[j],此時 v[i][j] = v[i-1][j]

程式碼:

class Solution {
public:
    int numDistinct(string s, string t) {
        if (s.length() == 0 || t.length() == 0) {
            if (t.length() == 0)
                return 1;
            else
                return 0;
        }
        vector<vector<int>> v(s.length(), vector<int>(t.length(), 0));
        v[0][0] = s[0] == t[0] ? 1 : 0;
        for (int i = 0; i < s.length(); ++i) {
            for (int j = 0; j < t.length(); ++j) {
                if (i != 0 && j == 0) {
                    if (s[i] == t[j])
                        v[i][j] = 1 + v[i-1][j];
                    else
                        v[i][j] = v[i-1][j];
                } else if (i != 0 && j != 0) {
                    v[i][j] = s[i] == t[j] ? v[i-1][j-1]+v[i-1][j] : v[i-1][j];
                }
            }
        }
        return v[s.length()-1][t.length()-1];
    }
};