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] = 0dp[i][0]:當text2為""時, LCS 必為""
➔dp[i][0] = 0dp[0][j]:當text1為""時, LCS 必為""
➔dp[0][j] = 0
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp
Solution 2:
想法:同 Solution 1, 發現其實計算
dp[i][j]只需用到當前列的dp[i][j - 1]和上一列的dp[i - 1][j], 因此只需紀錄當前列和上一列的計算結果即可, 而不用紀錄整個m x nmatrix, 這樣就能將 $O(m \cdot n)$ space 降至 $O(n)$ space
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(min(m, n))$ ➔
dp,nextRow
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論