@@ -3,32 +3,36 @@ package Problem0115
3
3
func numDistinct (s string , t string ) int {
4
4
m , n := len (s ), len (t )
5
5
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
13
9
}
14
10
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] 来说
18
21
// s[:i] 中符合条件的子字符串,按照是否包含 s[i-1],可以分成两个部分:
19
22
// 第一部分:
20
23
// **不**包含 s[i-1],
21
- // 这部分的数量,等于 dp[i-1]dp[j]
22
- dp [i ][j ] = dp [i - 1 ][j ]
24
+ // 这部分的数量,等于 dp[i-1]
23
25
// 第二部分:
24
26
// 包含 s[i-1]
25
27
// 这部分,只有当 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 ]
29
33
}
30
34
}
31
35
}
32
36
33
- return dp [m ][ n ]
37
+ return dp [m ]
34
38
}
0 commit comments