Longest Common Subsequence ⧉
A classic dynamic programming problem. The idea here is to keep an m*n table lcs
where lcs[r+1][c+1]
holds the length of the longest common subsequence between text1[:c]
and text2[:r]
. This is an improvement over bruteforce, because when the c
th character of text1
is the same as the r
th character of text2
, we can simply extend whatever longest common subsequence existed up to text1[:c]
and text2[:r]
, rather than recalculating these values.
_24class Solution {_24private:_24 array<array<int, 1001>, 1001> lcs;_24public:_24 int longestCommonSubsequence(string text1, string text2) {_24 const int n = text1.length();_24 const int m = text2.length();_24_24 // the lcs between anything and an empty string is 0_24 for (int r = 0; r < m; ++r) lcs[r][0] = 0;_24 for (int c = 0; c < n; ++c) lcs[0][c] = 0;_24_24 for (int r = 0; r < m; ++r) {_24 for (int c = 0; c < n; ++c) {_24 if (text1[c] == text2[r]) {_24 lcs[r+1][c+1] = lcs[r][c]+1;_24 } else {_24 lcs[r+1][c+1] = max(lcs[r+1][c], lcs[r][c+1]);_24 }_24 }_24 }_24 return lcs[m][n];_24 }_24};
If you found this solution helpful, consider leaving a star!