0%

115. 不同的子序列

115. 不同的子序列

动态规划

f(i, j)s[0...i)t[0...j]匹配到的个数

Base:

当t为空时,s总能成功匹配t

转移方程:

  1. s[i] == t[j]

    1. s[i]让自己和t[j]匹配:那么f(i + 1, j + 1)的值就包括了f(i, j)
    2. s[i]不让自己和t[j]匹配:那么对于s[0...i+1)来说,因为没有匹配,所以f(i + 1, j + 1)的值就包括f(i, j + 1),就是让前面s[0...i)去和t[0...j + 1)匹配
  2. s[i] != t[j]

    只能由前面的字符串去和t[0...i + 1)尝试匹配了。

所以最终的递推方程也由此得到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int numDistinct(string s, string t) {
int m = s.size(), n = t.size();
if(m < n)
return 0;
vector<vector<unsigned int>> dp(m + 1, vector<unsigned int>(n + 1));
dp[0][0] = 1;
for(int i = 0; i < m; ++i)
{
dp[i + 1][0] = 1;
for(int j = 0; j < n; ++j)
{
if(s[i] == t[j])
dp[i + 1][j + 1] = dp[i][j] + dp[i][j + 1];
else
dp[i + 1][j + 1] = dp[i][j + 1];
}
}
return dp.back().back();
}
};