Distinct Subsequences(Leetcode)
阿新 • • 發佈:2018-12-24
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"
"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]; } };