package
0.0.0-20241220224003-b7cf03a90b2b
Repository: https://github.com/szhou12/leetcode-go.git
Documentation: pkg.go.dev
# README
115. Distinct Subsequences
Solution idea
DP
$DP[i][j] = $ # of distinct subseq of s[1...i]
= t[1...j]
Base Cases:
-
$DP[0][0] = 1$
-
$DP[i][0] = 1$ 因为空串永远是
s[1...i]
的一个subsequence -
$DP[0][j] = 0$
Recurrence:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j] if s[i] == t[j]
= dp[i-1][j] if s[i] != t[j]
难点!!!
-
当
s[i] == t[j]
时,dp[i-1][j-1]
比较容易想到,dp[i-1][j]
难以想到。为什么要考虑用s[1...i-1]
来匹配t[1...j]
? 举个例子:s = bagg
,t = bag
, 此时, 我们可以用s
的末位 g 来匹配; 也可以不用, 用倒数第二位的 g 来匹配. -
当
s[i] != t[j]
时, 显然,此时s
的末位无法用来匹配, 那么只能回头看,尝试用s[1...i-1]
来匹配t[1...j]
Time complexity = $O(m*n)$ where $m$ is length of s
, $n$ is length of t