LeetCode 115 不同的子序列-动态规划 java讲解

力扣 115 动态规划题解-java代码

题目详情:

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是

题目数据保证答案符合 32 位带符号整数范围。

链接:题目位置

题目示例

解题思路:
  • 确定dp数组所代表的含义
  • 确定dp数组的递推公式
  • 确定dp数组的初始数值
  • 确定遍历顺序
解题过程:
  1. 确定dp数组所代表的含义:
    dp[ i ][ j ] 表示字符串 s[ 0-i ] 和 t[ 0-j ]的均闭子区间的子序列数

  2. 确定递推公式:
    这里为了大家方便理解,我一流程图的形式展示出来:
    在这里插入图片描述
    根据以上流程中的例子,我们就可以得出dp的递推公式。

  3. 确定dp数组的初始数值
    根据递推公式我们可以了解到:dp[ i ][ 0 ] 和 dp[ 0 ][ j ]是必需要初始化的。

  4. 确定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()];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值