LeetCode:115. Distinct Subsequences
写它的原因是它的状态方程比较难写。明白了之后是比较容易的,但是当时确实没有想出来。
class Solution {
public:
int numDistinct(string s, string t) {
int sLen = s.size(), tLen = t.size();
if (tLen > sLen)
return 0;
vector<vector<long long>> dp(sLen, vector<long long>(tLen, 0));
dp[0][0] = s[0] == t[0] ? 1 : 0;
int cnt = dp[0][0];
for (int i = 1; i < sLen; ++i) {
if (s[i] == t[0])
dp[i][0] = ++cnt;
else
dp[i][0] = dp[i-1][0];
}
for (int i = 1; i < sLen; ++i)
for (int j = 1; j < tLen; ++j) {
if (s[i] == t[j])
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
else
dp[i][j] = dp[i-1][j];
}
return dp.back().back();
}
};
//dp[i][j]:s[0...i]构成t[0...j]的数量
//如果s[i] == t[j]: dp[i][j] = dp[i-1][j-1] + dp[i-1][j](两种情况是用不用s[i],如果用,则占掉一个t[j],为dp[i-1][j-1];如果不用,则为dp[i-1][j])
//否则dp[i][j] = dp[i-1][j](没有办法,只能不用)
然后使用多一行一列来使编码更简单:
class Solution {
public:
int numDistinct(string s, string t) {
int sLen = s.size(), tLen = t.size();
if (tLen > sLen)
return 0;
vector<vector<long long>> dp(sLen+1, vector<long long>(tLen+1, 0));
for (int i = 0; i <= sLen; ++i)
dp[i][0] = 1;//此时j为0,问s构成一个空串的方式,肯定为1种
for (int i = 1; i <= sLen; ++i)
for (int j = 1; j <= tLen; ++j)
dp[i][j] = dp[i-1][j] + (s[i-1] == t[j-1]? dp[i-1][j-1] : 0);
return dp.back().back();
}
};