using
System;
using
System.Collections.Generic;
class
GFG
{
static
List<
int
> index_a =
new
List<
int
>();
static
List<
int
> index_b =
new
List<
int
>();
static
void
index(
int
[,]dp, String a, String b,
int
size_a,
int
size_b)
{
index_a.Clear();
index_b.Clear();
if
(size_a == 0 || size_b == 0)
return
;
if
(a[size_a - 1] == b[size_b - 1])
{
index(dp, a, b, size_a - 1, size_b - 1);
index_a.Add(size_a - 1);
index_b.Add(size_b - 1);
}
else
{
if
(dp[size_a - 1,size_b] > dp[size_a,
size_b - 1])
{
index(dp, a, b, size_a - 1, size_b);
}
else
{
index(dp, a, b, size_a, size_b - 1);
}
}
}
static
void
combine(String a, String b,
int
size_a,
int
size_b)
{
int
[,] dp =
new
int
[100, 100];
String ans =
""
;
int
k = 0, i, j;
for
(i = 1; i <= size_a; i++)
{
for
(j = 1; j <= size_b; j++)
{
if
(a[i-1] == b[j - 1])
{
dp[i, j] = dp[i - 1, j - 1] + 1;
}
else
{
dp[i, j] = Math.Max(dp[i, j - 1],
dp[i - 1, j]);
}
}
}
int
lcs = dp[size_a, size_b];
index(dp, a, b, size_a, size_b);
i = j = k;
while
(k < lcs)
{
while
(i < size_a && i < index_a[k])
{
ans += a[i++];
}
while
(j < size_b && j < index_b[k])
{
ans += b[j++];
}
ans = ans + a[index_a[k]];
k++;
i++;
j++;
}
while
(i < size_a)
{
ans += a[i++];
}
while
(j < size_b)
{
ans += b[j++];
}
Console.WriteLine(ans);
}
public
static
void
Main(String []args)
{
String a =
"algorithm"
;
String b =
"rhythm"
;
combine(a, b, a.Length,b.Length);
}
}