题目
题目描述
给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。
示例 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
提示:
1 <= s.length, t.length <= 1000
s 和 t 由英文字母组成
题解
这个问题可以通过动态规划(Dynamic Programming, DP)来解决。给定两个字符串 s
和 t
,我们需要计算 s
的子序列中 t
出现的次数。这里的关键在于理解如何通过递归和记忆化搜索或直接使用动态规划表来解决问题。
动态规划解法
我们可以定义一个二维的DP表 dp[i][j]
,其中 dp[i][j]
表示 t
的前 i
个字符作为 s
的前 j
个字符的子序列出现的次数。
状态转移方程:
- 如果
t[i-1] == s[j-1]
,那么dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
。dp[i-1][j-1]
:表示选择当前匹配的情况,即t
的第i
个字符与s
的第j
个字符匹配。dp[i][j-1]
:表示不选择当前匹配的情况,继续在s
的前j-1
个字符中寻找t
的前i
个字符。
- 如果
t[i-1] != s[j-1]
,那么dp[i][j] = dp[i][j-1]
,因为只能考虑不匹配当前字符的情况。
初始条件:
dp[0][j] = 1
对于所有的j >= 0
,因为空字符串t
是任何字符串s
的子序列。dp[i][0] = 0
对于所有的i > 0
,因为非空字符串t
不可能是空字符串s
的子序列。
Python 实现
def numDistinct