1092. Shortest Common Supersequence
題目網址:https://leetcode.cn/problems/shortest-common-supersequence/
題意:給兩 string
str1
和str2
, 返回同時以str1
和str2
作為 subsequence 的最短 string。如果答案不止一個, 則返回滿足條件的任意一個答案。如果從 string
T
中刪除一些char(也可能不刪除, 並且選出的這些 char 可以位於T
中的任意位置), 可以得到 stringS
, 那麼S
就是T
的subsequence)注意:
str1
、str2
皆由小寫字母所組成。
Solution:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
str1
、str2
前先加上一個#
, 代表什麼元素都沒有的狀態dp[i][j]
:str1[1:i]
、str2[1:j]
的 SCS 之長度2. 得到轉移方程:
- 若
str1[i] == str2[j]
:此時的 SCS 為原先的 SCS 加上str1[i]
即可
➔dp[i][j] = dp[i - 1][j - 1] + 1
- 否則, 此時的 SCS 為原先的 SCS 加上
str1[i]
或str2[j]
➔dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1
3. 初始化:
dp[0][0]
:兩個空""
的 SCS 為""
dp[i][0]
:str1[1:i]
和""
的 SCS 為str1[1:i]
➔dp[i][0] = i
, 其中1 ≤ i ≤ m
dp[0][j]
:""
和str2[1:j]
的 SCS 為str2[1:j]
➔dp[0][j] = j
, 其中1 ≤ j ≤ n
最後, 再從
str1
、str2
、dp
由後往前回推, 以構建出 SCS
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論