115. 不同的子序列(dp)
今天的题目是动态规划,数据范围是1000,所以考虑n^2的dp
设 dp[i][j] 表示从s的i位置到最后的范围中t[i…]出现的次数
所以转移方程分为以下两种情况:
1、s[i] == t[j]
这种情况下dp[i][j]可以从两个方向转移得到:dp[i+][j+1] 和 dp[i+1][j] ,分别对应字符s[i]在不在该子序列中的情况
2、s[i] != t[j]
这种情况下dp[i][j]只能从dp[i+1][j]这种状态转移得到
下面考虑边界的情况,当t是空串的时候,自然是每个s序列的子序列,代码如下:
class Solution {
public:
int numDistinct(string s, string t) {
int m = s.length();
int n = t.length();
if(n > m) return 0;
vector<vector<long>> dp(m + 1, vector<long>(n + 1));
for(int i = 0; i <= m; i++){
dp[i][n] = 1;
}
for(int i = m - 1; i >= 0; i--){
for(int j = n - 1; j >= 0; 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[0][0];
}
};