1143. Longest Common Subsequence
題目網址:https://leetcode.cn/problems/longest-common-subsequence/
題意:給兩 string
text1
、text2
, 返回最長共同 subsequence 的長度。若不存在最長共同 subsequence, 則返回0
。注意:
- substring 指的是 string 中連續的 subset
- subsequence 則是 string 的 subset
text1
、text2
只由小寫字母所組成
Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
text1
、text2
前先加上一個#
, 代表什麼元素都沒有的狀態dp[i][j]
:text1[1:i]
、text2[1:j]
的 LCS 之長度2. 得到轉移方程:
令
text1[1:i] = XXXXi
,text2[1:j] = YYYj
若
text1[i] == text2[j]
, 則[XXXX]
、[YYY]
之 LCS 再加上text1[i]
即可
➔dp[i][j] = dp[i - 1][j - 1] + 1
否則, LCS 為以下兩種中取較大者
[XXXXi]
、[YYY]
:dp[i][j - 1]
[XXXX]
、[YYYj]
:dp[i - 1][j]
➔
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
3. 初始化:
dp[0][0]
:當text1
、text2
皆為""
時, LCS 必為""
➔dp[0][0] = 0
dp[i][0]
:當text2
為""
時, LCS 必為""
➔dp[i][0] = 0
dp[0][j]
:當text1
為""
時, LCS 必為""
➔dp[0][j] = 0
cpp
class Solution { |
- time:
➔ for loop - space:
➔dp
Solution 2:
想法:同 Solution 1, 發現其實計算
dp[i][j]
只需用到當前列的dp[i][j - 1]
和上一列的dp[i - 1][j]
, 因此只需紀錄當前列和上一列的計算結果即可, 而不用紀錄整個m x n
matrix, 這樣就能將space 降至 space
cpp
class Solution { |
- time:
➔ for loop - space:
➔dp
,nextRow
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論