Skip to content

Commit 26e0800

Browse files
aQuaaQua
aQua
authored and
aQua
committed
115 accepted. 3ms.
1 parent c442bc5 commit 26e0800

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

Algorithms/0115.distinct-subsequences/distinct-subsequences.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,36 @@ package Problem0115
33
func numDistinct(s string, t string) int {
44
m, n := len(s), len(t)
55

6-
// dp[i][j] == numDistinct(s[:i], t[:j])
7-
dp := make([][]int, m+1)
8-
for i := 0; i <= m; i++ {
9-
dp[i] = make([]int, n+1)
10-
// numDistinct(s[:i], "") == 1
11-
// s[:i] 删除所有的字符后,才会变成 "",只有这一种可能。
12-
dp[i][0] = 1
6+
dp := make([]int, m+1)
7+
for i := 0; i < m+1; i++ {
8+
dp[i] = 1
139
}
1410

15-
for j := 1; j <= n; j++ {
16-
for i := j; i <= m; i++ {
17-
// 对于 dp[i][j] 来说
11+
// dp[i] 在更新前的值,即 s[:i] 与 t[:j] 的匹配值
12+
// 有可能会在更新 dp[i+1] ,即 s[:i] 与 t[:j+1] 的匹配值,的时候用到
13+
// 利用 prev 保存起来
14+
var prev int
15+
16+
for j := 0; j < n; j++ {
17+
dp[j], prev = 0, dp[j]
18+
19+
for i := j + 1; i < m+1; i++ {
20+
// 对于 dp[i] 来说
1821
// s[:i] 中符合条件的子字符串,按照是否包含 s[i-1],可以分成两个部分:
1922
// 第一部分:
2023
// **不**包含 s[i-1],
21-
// 这部分的数量,等于 dp[i-1]dp[j]
22-
dp[i][j] = dp[i-1][j]
24+
// 这部分的数量,等于 dp[i-1]
2325
// 第二部分:
2426
// 包含 s[i-1]
2527
// 这部分,只有当 s[i-1] == t[j-1] 的时候,才存在
26-
// 存在的话,这部分的数量,等于 dp[i-1][j-1]
27-
if s[i-1] == t[j-1] {
28-
dp[i][j] += dp[i-1][j-1]
28+
// 存在的话,这部分的数量,等于 prev
29+
if t[j] == s[i-1] {
30+
dp[i], prev = dp[i-1]+prev, dp[i]
31+
} else {
32+
dp[i], prev = dp[i-1], dp[i]
2933
}
3034
}
3135
}
3236

33-
return dp[m][n]
37+
return dp[m]
3438
}

0 commit comments

Comments
 (0)