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] = 1
dp[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!
評論