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];
}
};