学习动态规划
follow:代码随想录
115. 不同子序列
题目描述:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
示例:
输入:s = “rabbbit”, t = “rabbit”
输出:3
解释:
如下图所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。
解析:
这道题是删除元素的考虑角度!
- 确定dp数组的含义
dp[i][j]:下标为0 - i-1的s包含多少个下标为0 - j-1的t - 确定递推公式
如果最后一个字符相等:用s[i-1]匹配 + 不用s[i-1]匹配
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
如果最后一个字符不等:不用s[i-1]匹配
dp[i][j] = dp[i - 1][j] - 初始化
dp[i][0]:删除i-1字符串中的元素,出现空字符串的个数,为一
dp[0][j]:删除空字符串中的元素,出现j-1字符串的个数,为零
public int numDistinct(String s, String t) {
if(s.length() < t.length()) return 0;
int[][] dp = new int[s.length() + 1][t.length() + 1];
dp[0][0] = 1;
for(int i = 0; i < s.length(); i++){
dp[i][0] = 1;
}
for(int j = 1; j <= t.length(); j++){
for(int i = j; i <= s.length(); i++){
if(s.charAt(i - 1) == t.charAt(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.length()][t.length()];
}