# 【LeetCode】 1143. Longest Common Subsequence ## Description > Given two strings `text1` and `text2`, return the length of their longest common subsequence. > 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. (eg, "ace" is a subsequence of "abcde" while "aec" is not). A common subsequence of two strings is a subsequence that is common to both strings. > If there is no common subsequence, return 0. > Constraints: > * `1 <= text1.length <= 1000` > * `1 <= text2.length <= 1000` > * The input strings consist of lowercase English characters only. > 給兩個字串 `text1` 和 `text2`, 回傳它們最長共同子字串的長度。 > 一個字串的子字串是從原始字串生成的新字串,其中刪除了一些字元(可以是空字元)而不改變其餘字元的相對順序。(例如:"ace"是"abcde"的子字串,而"aec"則不是)。兩個字串的共同子字串是指該子字串同時為兩者的子字串。 > 如果沒有任何共同子字串,回傳0。 > 限制: > * `1 <= text1.length <= 1000` > * `1 <= text2.length <= 1000` > * 輸入字串只會包含小寫英文字母。 ## Example: ``` 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. ``` ## Solution * 經典的DP題目。 * 首先我們設兩個變數`m`和`n`分別為兩個字串的長度。 * 建一個DP表,且大小為`m + 1` x `n + 1`。 * 表格的意義為:`text1`和`text2`只取前`i`個和前`j`個字的時候的最長共同子字串。 * DP表大小要多一格是因為要考慮到空字串。 * 空字串一定沒有共同子字串(或者說共同子字串只有空字串),因此表格中`i = 0`或是`j = 0`都填入`0`。 * 當`text[i] == text[j]`時,此時填入`dp[i - 1][j - 1] + 1`。 * 代表目前最長的就是去掉最後一個字的最長子字串再 +1。 * 若是不等於,填入`dp[i - 1][j]`和`dp[i][j - 1]`較大者。 * 代表不看`text1`或是`text2`的最後一個字,取較長者。 * 整理成遞迴式: $$ dp[i][j] = \\ \left\{\begin{matrix} 0,\ i=0\ OR\ j=0 \\ dp[i-1][j-1],\ s[i]=s[j] \\ max(dp[i-1][j], dp[i][j-1]),\ other \end{matrix}\right. $$ * 最後取`dp[m][n]`就是答案了。 * 前`m`個和前`n`個就是原來的兩個字串。 ### Code ```C++=1 class Solution { public: int longestCommonSubsequence(string text1, string text2) { int m = text1.length(); int 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]; } }; ``` ###### tags: `LeetCode` `C++`