-
Notifications
You must be signed in to change notification settings - Fork 0
/
115. 不同的子序列.scala
55 lines (47 loc) · 1.29 KB
/
115. 不同的子序列.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 给定一个字符串 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
// ^^^
object Solution {
def numDistinct(s: String, t: String): Int = {
val (m, n) = (s.length, t.length)
val dp = new Array[Int](n + 1) // 压缩数组
dp(0) = 1
for {
i <- 0 to m
j <- n to 1 by -1
if i >= j
} {
dp(j) += (if (j - 1 >= 0 && s(i - 1) == t(j - 1)) dp(j - 1) else 0)
}
dp(n)
}
}