using
System;
using
System.Collections.Generic
namespace
LongestCommonSubsequence
{
public
class
GFG{
static
void
Main(
string
[] args)
{
string
a =
"AGGTAB"
;
string
b =
"GXTXAYB"
;
Console.WriteLine(LCS(a, b));
}
static
string
Reverse(
string
str)
{
char
[] charArray = str.ToCharArray();
Array.Reverse(charArray);
return
new
string
(charArray);
}
static
string
MaxStr(
string
a,
string
b)
{
return
a.Length > b.Length ? a : b;
}
static
string
LCS_Core(
string
a,
string
b, Dictionary<
string
,
string
> dp, Dictionary<
string
,
int
> vs)
{
int
n_a = a.Length;
int
n_b = b.Length;
if
(n_a == 0 || n_b == 0)
{
return
""
;
}
string
dp_i = a +
","
+ b;
string
ans;
if
(dp.TryGetValue(dp_i,
out
ans))
{
return
ans;
}
vs[dp_i] = 1;
if
(a[n_a - 1] == b[n_b - 1])
{
ans = a[n_a - 1] + LCS_Core(a.Substring(0, n_a - 1), b.Substring(0, n_b - 1), dp, vs);
dp[dp_i] = ans;
return
ans;
}
ans = MaxStr(LCS_Core(a.Substring(0, n_a - 1), b, dp, vs), LCS_Core(a, b.Substring(0, n_b - 1), dp, vs));
dp[dp_i] = ans;
return
ans;
}
static
string
LCS(
string
a,
string
b)
{
Dictionary<
string
,
string
> dp =
new
Dictionary<
string
,
string
>();
Dictionary<
string
,
int
> vs =
new
Dictionary<
string
,
int
>();
string
ans = LCS_Core(a, b, dp, vs);
return
Reverse(ans);
}
}
}