JAVA学习-练习试用Java实现“不同的子序列”

发布于:2024-06-21 ⋅ 阅读:(111) ⋅ 点赞:(0)

问题:


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

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

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

示例 1:

输入:s = "rabbbit", t = "rabbit"
输出:3

解释:
如下图所示, 有 3 种可以从 s 中得到 
"rabbit" 的方案。
rabbbit

rabbbit

rabbbit
示例 2:

输入:s = "babgbag", t = "bag"
输出:5
解释:
如下图所示, 有 5 种可以从 s 中得到 
"bag" 的方案。 
babgbag

babgbag

babgbag

babgbag

babgbag

提示:

0 <= s.length, t.length <= 1000
s 和 t 由英文字母组成

 

解答思路:

1、题目分析:

- 本题要求计算字符串 's' 的子序列中字符串 't' 出现的个数。

- 需要找到所有可能的匹配情况,可以通过动态规划来解决。

2、主要思路:

- 定义一个二维数组 'dp',其中 'dp[i][j]' 表示字符串 's' 的前 'i' 个字符和字符串 't' 的前 'j' 个字符的匹配情况。

- 初始化边界情况,当 'j=0' 时,'dp[i][0]' 表示字符串 's' 的前 'i' 个字符是否可以通过删除一些字符得到空字符串,即 'dp[i][0]=1'。

- 递推关系为:如果 's[i]==t[j]',则 'dp[i][j]=dp[i-1][j-1]+dp[i-1][j]';否则 'dp[i][j]=dp[i-1][j]'。

- 最终答案为 'dp[s.length()][t.length()]'。

以下是修改后的代码:

```java

class Solution {

    public int numDistinct(String s, String t) {

        int m = s.length(), n = t.length();

        int[][] dp = new int[m + 1][n + 1];

 

        // 初始化边界情况

        for (int i = 0; i <= m; i++) {

            dp[i][0] = 1;

        }

 

        // 动态规划

        for (int i = 1; i <= m; i++) {

            for (int j = 1; j <= n; 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[m][n];

    }

}

```

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

 

 


网站公告

今日签到

点亮在社区的每一天
去签到