力扣 115 动态规划题解-java代码
题目详情:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
题目数据保证答案符合 32 位带符号整数范围。
链接:题目位置
解题思路:
- 确定dp数组所代表的含义
- 确定dp数组的递推公式
- 确定dp数组的初始数值
- 确定遍历顺序
解题过程:
-
确定dp数组所代表的含义:
dp[ i ][ j ] 表示字符串 s[ 0-i ] 和 t[ 0-j ]的均闭子区间的子序列数 -
确定递推公式:
这里为了大家方便理解,我一流程图的形式展示出来:
根据以上流程中的例子,我们就可以得出dp的递推公式。 -
确定dp数组的初始数值
根据递推公式我们可以了解到:dp[ i ][ 0 ] 和 dp[ 0 ][ j ]是必需要初始化的。 -
确定dp数组的遍历顺序。
为了方便dp数组初始化,遍历顺序选择:
1 <= i <= s.length();
1 <= j <= t.length();
最终题解代码:
public int getDif(String s,String t){
int dp[][] = new int[s.length() + 1][t.length() + 1];
//以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]
for(int i = 0;i < s.length() + 1;i++) dp[i][0] = 1;
for(int i = 1;i < s.length() + 1;i++){
for (int j = 1;j <t.length() + 1;j++){
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()];
}