- 题目描述
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是。
提示:
- 0 <= s.length, t.length <= 1000
- s 和 t 由英文字母组成
- 题目数据保证答案符合 32 位带符号整数范围。
来源:LeetCode
- 示例
- 示例 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
^^^
- 思路分析
- 看到“两个字符串”和“子序列”很容易想到动态规划的一道经典例题:找出两个字符串的最长公共子序列。这道题在最长公共子序列上略有变化,因为如果存在,最长公共子序列一定是字符串t的长度;这里问的是s的子序列有几个t。
- 我们仍然采用动态规划的思想。定义 d p [ i , j ] dp[i, j] dp[i,j],表示字符串 s s s的前 j j j个字符中有多少个字符串 t t t的前 i i i个字符。最终需要返回的结果是 d p [ t . l e n g t h ( ) − 1 ] [ t . l e n g t h ( ) − 1 ] dp[t.length()-1][t.length()-1] dp[t.length()−1][t.length()−1]。
- 我们先考虑 s [ j ] s[j] s[j]和