Given two character arrays, arr1[m] and arr2[n], determine a longest common subsequence among these two arrays.
Dynamic programming to solve it in O(mn) time and space.
LCS[i, j] = LCS[i-1][j-1] + 1 ; arr1[i] == arr2[j]
= MAX(LCS[i-1][j], LCS[i][j-1]) ; otherwise
Dynamic programming to solve it in O(mn) time and space.
LCS[i, j] = LCS[i-1][j-1] + 1 ; arr1[i] == arr2[j]
= MAX(LCS[i-1][j], LCS[i][j-1]) ; otherwise
#define MAX(a,b) ((a)>(b))?(a):(b)
int LCS[100][100];
int lcs(char* arr1, int len1, char* arr2, int len2)
{
int i = 0;
int j = 0;
//LCS is 0 when arr2 is NULL
for(i=0; i <= len1; i++)
LCS[i][0] = 0;
//LCS is 0 when arr1 is NULL
for(j=0; j <= len2; j++)
LCS[0][j] = 0;
for(i=1; i <= len1; i++)
{
for(j=1; j <= len2; j++)
{
if(arr1[i] == arr2[j])
LCS[i][j] = LCS[i-1][j-1] + 1;
else
LCS[i][j] = MAX(LCS[i-1][j], LCS[i][j-1]);
}
}
int temp = LCS[len1][len2];
return temp;
}
int main()
{
char* arr1 = "adbcad";
char* arr2 = "dbacd";
printf("LCS: %d\n", lcs(arr1, strlen(arr1), arr2, strlen(arr2)));
return 0;
}
OR
public static void main(String []args)
{
String a = "ABCDEFGHIJKL";
String b = "ABCD";
int max = 0;
int z=0; // Store the index of the last element of Substring
int m[][] = new int[a.length()][b.length()];
for(int i=0;i<a.length();i++)
{
m[i][0] = 0;
}
for(int i=0;i<b.length();i++)
{
m[0][i] = 0;
}
for(int i=0;i<a.length();i++)
{
for(int j=0;j<b.length();j++)
{
if(a.charAt(i) == b.charAt(j))
{
if(i==0 || j==0) // If first element is in the substring
{
m[i][j] = 1;
}
else
{
m[i][j] = m[i-1][j-1] + 1;
}
if(m[i][j] > max)
{
max = m[i][j];
z = j;
}
}
}
}
System.out.println(max);
System.out.println(z);
}
No comments:
Post a Comment