Printing Longest Common Subsequence | GeeksforGeeks
Given two sequences, print the longest subsequence present in both of them.
Java Solution
https://www.hackerrank.com/challenges/dynamic-programming-classics-the-longest-common-subsequence
https://codepair.hackerrank.com/paper/ZggdyeVg?b=eyJyb2xlIjoiY2FuZGlkYXRlIiwibmFtZSI6ImplZmZlcnl5dWFuIiwiZW1haWwiOiJ5dWFueXVuLmtlbm55QGdtYWlsLmNvbSJ9
private static void findLCS(int[] a, int[] b) {
int[][] lcs = new int[a.length+1][b.length+1];
for(int i = 0; i <= a.length; i++) {
for(int j = 0; j <= b.length; j++) {
if(i == 0 | j == 0)
lcs[i][j] = 0;
else if(a[i-1] == b[j-1])
lcs[i][j] = lcs[i-1][j-1] +1;
else
lcs[i][j] = lcs[i-1][j] > lcs[i][j-1] ? lcs[i-1][j]:lcs[i][j-1]; }
}
int[] result = new int[lcs[a.length][b.length]];
int index = result.length;
int i = a.length, j = b.length;
while(i > 0 && j > 0) {
if(a[i-1] == b[j-1]) {
result[index-1] = a[i-1];
index--; i--; j--;
} else {
if(lcs[i-1][j] > lcs[i][j-1]) {
i--;
} else {
j--;
}
}
}
for(int x:result)
System.out.print(x + " ");
}
Read full article from Printing Longest Common Subsequence | GeeksforGeeks
Given two sequences, print the longest subsequence present in both of them.
Following is detailed algorithm to print the LCS. It uses the same 2D table L[][].
1) Construct L[m+1][n+1] using the steps discussed in previous post.
2) The value L[m][n] contains length of LCS. Create a character array lcs[] of length equal to the length of lcs plus 1 (one extra to store \0).
2) Traverse the 2D array starting from L[m][n]. Do following for every cell L[i][j]
…..a) If characters (in X and Y) corresponding to L[i][j] are same (Or X[i-1] == Y[j-1]), then include this character as part of LCS.
…..b) Else compare values of L[i-1][j] and L[i][j-1] and go in direction of greater value.
…..a) If characters (in X and Y) corresponding to L[i][j] are same (Or X[i-1] == Y[j-1]), then include this character as part of LCS.
…..b) Else compare values of L[i-1][j] and L[i][j-1] and go in direction of greater value.
void lcs( char *X, char *Y, int m, int n ){ int L[m+1][n+1]; /* Following steps build L[m+1][n+1] in bottom up fashion. Note that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */ for (int i=0; i<=m; i++) { for (int j=0; j<=n; j++) { if (i == 0 || j == 0) L[i][j] = 0; else if (X[i-1] == Y[j-1]) L[i][j] = L[i-1][j-1] + 1; else L[i][j] = max(L[i-1][j], L[i][j-1]); } } // Following code is used to print LCS int index = L[m][n]; // Create a character array to store the lcs string char lcs[index+1]; lcs[index] = '\0'; // Set the terminating character // Start from the right-most-bottom-most corner and // one by one store characters in lcs[] int i = m, j = n; while (i > 0 && j > 0) { // If current character in X[] and Y are same, then // current character is part of LCS if (X[i-1] == Y[j-1]) { lcs[index-1] = X[i-1]; // Put current character in result i--; j--; index--; // reduce values of i, j and index } // If not same, then find the larger of two and // go in the direction of larger value else if (L[i-1][j] > L[i][j-1]) i--; else j--; } // Print the lcs cout << "LCS of " << X << " and " << Y << " is " << lcs;}https://www.hackerrank.com/challenges/dynamic-programming-classics-the-longest-common-subsequence
https://codepair.hackerrank.com/paper/ZggdyeVg?b=eyJyb2xlIjoiY2FuZGlkYXRlIiwibmFtZSI6ImplZmZlcnl5dWFuIiwiZW1haWwiOiJ5dWFueXVuLmtlbm55QGdtYWlsLmNvbSJ9
private static void findLCS(int[] a, int[] b) {
int[][] lcs = new int[a.length+1][b.length+1];
for(int i = 0; i <= a.length; i++) {
for(int j = 0; j <= b.length; j++) {
if(i == 0 | j == 0)
lcs[i][j] = 0;
else if(a[i-1] == b[j-1])
lcs[i][j] = lcs[i-1][j-1] +1;
else
lcs[i][j] = lcs[i-1][j] > lcs[i][j-1] ? lcs[i-1][j]:lcs[i][j-1]; }
}
int[] result = new int[lcs[a.length][b.length]];
int index = result.length;
int i = a.length, j = b.length;
while(i > 0 && j > 0) {
if(a[i-1] == b[j-1]) {
result[index-1] = a[i-1];
index--; i--; j--;
} else {
if(lcs[i-1][j] > lcs[i][j-1]) {
i--;
} else {
j--;
}
}
}
for(int x:result)
System.out.print(x + " ");
}
Read full article from Printing Longest Common Subsequence | GeeksforGeeks