力扣-动态规划-115 不同子序列
思路
- dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个
- 递推公式:
if(s[i-1] == t[j-1]){ dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; }else{ dp[i][j] = dp[i-1][j]; }
在该元素相同时,有两种可能1:使用该元素,所以0_i-2中有多少个0_j-2,这样再加上i-1和j-1,这满足了0_i-1的字符串中有0_j-1的字符串;第二种可能,不使用该元素,直接看0_i-2的字符串中有0_j-1的字符串 不相同时,只能不用i-1,要跳过i-1,所以沿用前一个结果
- dp数组初始化:for(int i = 0; i <= s.size(); i++) dp[i][0] = 1;
- 遍历顺序:顺序
- 时间复杂度:
代码
class Solution {
public:
int numDistinct(string s, string t) {
long long mod = 10E9 + 7;
vector< vector<long long>> dp(s.size() + 1, vector<long long>(t.size() + 1, 0));
for(int i = 0; i <= s.size(); i++) dp[i][0] = 1;
for(int i = 1; i <= s.size(); i++){
for(int j = 1; j <= t.size(); j++){
if(s[i-1] == t[j-1]){
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[s.size()][t.size()];
}
};