115. Distinct Subsequences
題目網址:https://leetcode.cn/problems/distinct-subsequences/
題意:給兩 string
s和t, 返回在s的 subsequence 中t出現的個數。題目保證答案符合 32-bit 有號整數的範圍。

Solution 1:
想法:利用 DP
1. 定義狀態:
dp[i][j]:s[1:i]中 subseq 為t[1:j]的個數2. 得到轉移方程:
當
s[i] == t[j]時, 有兩種情況:
- 用
s[i]去匹配t[j]:
➔ 則問題變成s[1:(i-1)]中 subseq 為t[1:(j-1)]的數量
➔dp[i][j] = dp[i - 1][j - 1]- 不用
s[i]去匹配t[j]:
➔ 則問題變成s[1:(i-1)]中 subseq 為t[1:j]的數量
➔dp[i][j] = dp[i - 1][j]
否則, 問題變成
s[1:(i-1)]中 subseq 為t[1:j]的數量
➔dp[i][j] = dp[i - 1][j]3. 初始化:
dp[i][0]:當t = ""時,s中能匹配的 subseq 就只有""一種(取法只有一種, 就是什麼都不取)
➔dp[i][0] = 1dp[0][j]:當s = ""時, 除了dp[0][0] = 1以外, 其餘的dp[0][j] = 0, 其中1 ≤ j ≤ n
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp
Solution 2:
想法:改善 Solution 1, 由於
dp[i][j]只會用到上一列狀態的dp[i - 1][j - 1]和dp[i - 1][j], 故只需要儲存上一列的狀態即可, 根本不需開到 $O(m \cdot n)$ space
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論
