1143. Longest Common Subsequence
Question
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 <= 1000text1andtext2consist of only lowercase English characters.
Solutions
Use dynamic programming
int longestCommonSubsequence(string text1, string text2) {
int m = static_cast<int>(text1.size());
int n = static_cast<int>(text2.size());
// dp[i][j] definition:
// longest common subsequence length when text1 at length i and text2 at length j.
// where i is from 0 to m, j is from 0 to n;
// base case should initialized as 0 because when length is 0 (e.g. i = 0), there's no common subsequence.
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] == text[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
}
}
}
return dp[m][n];
}