115. 不同的子序列
题目描述:
给你两个字符串 s
和 t
,统计并返回在 s
的 子序列 中 t
出现的个数,结果需要对 109 + 7 取模。
解题思路:
算法思路:
1.
状态表⽰:
对于两个字符串之间的
dp
问题,我们⼀般的思考⽅式如下:
i.
选取第⼀个字符串的
[0, i]
区间以及第⼆个字符串的
[0, j]
区间当成研究对象,结
合题⽬的要求来定义「状态表⽰」;
ii.
然后根据两个区间上「最后⼀个位置的字符」,来进⾏「分类讨论」,从⽽确定「状态转移
⽅程」。
我们可以根据上⾯的策略,解决⼤部分关于两个字符串之间的
dp
问题。
dp[i][j]
表⽰:在字符串
s
的
[0, j]
区间内的所有⼦序列中,有多少个
t
字符串
[0,
i]
区间内的⼦串。
2.
状态转移⽅程:
⽼规矩,根据「最后⼀个位置」的元素,结合题⽬要求,分情况讨论:
i.
当
t[i] == s[j]
的时候,此时的⼦序列有两种选择:
•
⼀种选择是:⼦序列选择
s[j]
作为结尾,此时相当于在状态
dp[i - 1][j - 1]
中的所有符合要求的⼦序列的后⾯,再加上⼀个字符
s[j]
(请⼤家结合状态表⽰,
好好理解这句话),此时
dp[i][j] = dp[i - 1][j - 1]
;
•
另⼀种选择是:我就是任性,我就不选择
s[j]
作为结尾。此时相当于选择了状态
dp[i][j - 1]
中所有符合要求的⼦序列。我们也可以理解为继承了上个状态⾥⾯的
求得的⼦序列。此时
dp[i][j] = dp[i][j - 1]