1143. Longest Common Subsequence

• Hardness: $$\color{orange}\textsf{Medium}$$
• Ralated Topics: StringDynamic Programming

### 一、題目#

Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0. A subsequence of a string is a new string generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters.

• For example, "ace" is a subsequence of "abcde". A common subsequence of two strings is a subsequence that is common to both strings.

Example 1:

• Input: text1 = “abcde”, text2 = “ace”
• Output: 3
• Explanation: The longest common subsequence is “ace” and its length is 3.

Example 2:

• Input: text1 = “abc”, text2 = “abc”
• Output: 3
• Explanation: The longest common subsequence is “abc” and its length is 3.

Example 3:

• Input: text1 = “abc”, text2 = “def”
• Output: 0
• Explanation: There is no such common subsequence, so the result is 0.

Constraints:

• 1 <= text1.length, text2.length <= 1000
• text1 and text2 consist of only lowercase English characters.

### 二、分析#

• 雙序列型的動態規劃問題。或我習慣稱作 LCS 型。
• 定義 dp[i][j]s[1:i]t[1:j] 的 LCS 長度。
• 利用s[i]t[j]，使dp[i][j]dp[i-1][j]dp[i][j-1]dp[i-1][j-1] 產生關聯。
• 遍歷兩層迴圈，核心以從 s[i]t[j] 的關係作破口，對 dp[i][j] 作轉移。
• s[i] == t[j] 時，dp[i][j] = dp[i-1][j-1]
• 相反則，dp[i][j] = max(dp[i-1], dp[j-1]
• 最後解為 dp[m][n]ms 的長度，nt 的長度。

### 三、解題#

#### 1. DP#

• Time complexity: $$O(m\times n)$$
• Space complexity: $$O(m\times n)$$
int longestCommonSubsequence(string text1, string text2) {
int m = text1.length(), n = text2.length();
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (text1[i-1] == text2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[m][n];
}