题目
Given a string S
and a string T
, count the number of distinct subsequences of S
which equals T
.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE"
is a subsequence of "ABCDE"
while "AEC"
is not).
Example 1:1
2
3
4
5
6
7
8
9
10
11
12
13Input: S = "rabbbit", T = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
Example 2:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Input: S = "babgbag", T = "bag"
Output: 5
Explanation:
As shown below, there are 5 ways you can generate "bag" from S.
(The caret symbol ^ means the chosen letters)
babgbag
^^ ^
babgbag
^^ ^
babgbag
^ ^^
babgbag
^ ^^
babgbag
^^^
题解
- 本题是一道动态规划类型的问题,给出两个字符串
s
、t
,计算S
的不同子序列中等于T
的子序列数量。 - 一开始有点迷茫,不知道其中的转移方程是怎样的,只能举例然后观察一下其中的状态转移方程了。使用
dp[i][j]
记录字符串S
的前i
个字符的子串中有多少个与字符串T
的前j
个字符构成的子串相等的子序列。 - Example 1 -
S = "rabbbit", T = "rabbit"
T \ S | $\emptyset$ | r | a | b | b | b | i | t |
---|---|---|---|---|---|---|---|---|
$\emptyset$ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
r | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
a | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
b | 0 | 0 | 0 | 1 | 2 | 3 | 3 | 3 |
b | 0 | 0 | 0 | 0 | 1 | 3 | 3 | 3 |
i | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 3 |
t | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
- Example 2 -
S = "babgbag", T = "bag"
T \ S | $\emptyset$ | b | a | b | g | b | a | g |
---|---|---|---|---|---|---|---|---|
$\emptyset$ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
b | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 3 |
a | 0 | 0 | 1 | 1 | 1 | 1 | 4 | 4 |
g | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 5 |
- 通过对样例的分析,我们可以得到
dp[i][j] >= dp[i][j-1]
在j-1>=0
的条件下。同时当T
为空串的时候,dp[i][0] = 1
,因为空串是任一字符串的子串。再仔细观察,可以得到当s[i-1] == t[j-1]
的时候,dp[i][j] = dp[i-1][j] + dp[i-1][j-1]
。综合起来,我们可以得到状态转移的表示:dp[i][j] = dp[i-1][j] + (s[i-1] == t[j-1] ? dp[i-1][j-1] : 0);
实现代码
1 | class Solution { |