Given two strings str1 and str2. Compute a largest common subsequence.
Suppose the two input string are S1 and S2, which has the length m and n separately. We can set a two dimension array M[ i ][ j ] to represent the optimal solution of i of length S1 and j of length S2. We just want to compute the value of M[ m ][ n ]. There are twocases:
One case:
When S1[ i ] = S2[ j ], the M[ i ][ j ] is equal to M[]i-1[j-1] + 1.
Second case:
When S1[ i ] != S2[ j ], the M[ i ][ j ] is equal to the Max(M[i-1][j],M[i][j-1]);
So we can write the recursion function such as below:
We can use a bottom-up dynamic programming to compute each subproblemM[i][j] until we get the value of M[m][n].
import java.io.*;
public class LargestCommonSubsequence{
public int LCS(char[] x, char[] y){
int[][] M = new int[x.length][y.length];
for(int i = 0; i<x.length;i++){
for(int j = 0; j<y.length;j++){
int f;
if((i==0||j==0)&&x[i]==y[j])
f = 1;
else if((i==0||j==0)&&x[i]!=y[j])
f = 0;
else if(j>0&&i>0&&x[i]==y[j])
f = M[i-1][j-1]+1;
else
f = Math.max(M[i-1][j],M[i][j-1]);
M[i][j] = f;
}
}
return M[x.length-1][y.length-1];
}
public static void main(String[] args){
LargestCommonSubsequence l = new LargestCommonSubsequence();
char[] c1 = "ALGORITHMS".toCharArray();
char[] c2 = "PROGRAMS".toCharArray();
System.out.println("The largest common subsequence length is: "+ l.LCS(c1,c2));
}
}