Following is a DP solution of this problem.
/**/
/*
Name: LCS.H
Name: LCS.H
Copyright: All Right Reserved 2008 Li Zu-ding
Author: li zu-ding<lizuding@gmail.com>
Date: 29-02-08 08:47
Description: this code is the answer of longest common subsquence(LCS) problem
*/
#include < iostream >
#include < assert .h >
using namespace std;
enum Direct ... { kNull = 0, kUpperRight, kUpper, kRight } ;
template < typename T, int size1, int size2 >
void length_of_lcs(T ( & str1)[size1], T ( & str2)[size2],
int ( & length)[size1][size2],
Direct ( & direct)[size1][size2]) ... {
int i, j;
for (i = 0; i < size1; ++i)
length[i][0] = kNull;
for (j = 0; j < size2; ++j)
length[0][j] = kNull;
for (i = 1; i < size1; ++i)
for (j = 1; j != size2; ++j) ...{
if (str1[i] == str2[j] ) ...{
length[i][j] = length[i-1][j-1] + 1;
direct[i][j] = kUpperRight;
} else ...{
if (length[i-1][j] > length[i][j-1]) ...{
length[i][j] = length[i-1][j];
direct[i][j] = kRight;
} else ...{
length[i][j] = length[i][j-1];
direct[i][j] = kUpper;
}
}
}
}
template < typename T, typename Functor, int size1, int size2 >
void construct_lcs(Direct ( & direct)[size1][size2],
T ( & r_str)[size1],
int i, int j, Functor functor) ... {
if ((0 == i) or (0 == j))
return;
if (kUpperRight == direct[i][j]) ...{
functor(r_str[i]);
construct_lcs(direct, r_str, i-1, j-1, functor);
} else
if (kUpper == direct[i][j])
construct_lcs(direct, r_str, i, j-1, functor);
else
if (kRight == direct[i][j])
construct_lcs(direct, r_str, i-1, j, functor);
}
struct print
... {
void operator()(char c) ...{ cout << c << " "; }
} ;
Author: li zu-ding<lizuding@gmail.com>
Date: 29-02-08 08:47
Description: this code is the answer of longest common subsquence(LCS) problem
*/
#include < iostream >
#include < assert .h >
using namespace std;
enum Direct ... { kNull = 0, kUpperRight, kUpper, kRight } ;
template < typename T, int size1, int size2 >
void length_of_lcs(T ( & str1)[size1], T ( & str2)[size2],
int ( & length)[size1][size2],
Direct ( & direct)[size1][size2]) ... {
int i, j;
for (i = 0; i < size1; ++i)
length[i][0] = kNull;
for (j = 0; j < size2; ++j)
length[0][j] = kNull;
for (i = 1; i < size1; ++i)
for (j = 1; j != size2; ++j) ...{
if (str1[i] == str2[j] ) ...{
length[i][j] = length[i-1][j-1] + 1;
direct[i][j] = kUpperRight;
} else ...{
if (length[i-1][j] > length[i][j-1]) ...{
length[i][j] = length[i-1][j];
direct[i][j] = kRight;
} else ...{
length[i][j] = length[i][j-1];
direct[i][j] = kUpper;
}
}
}
}
template < typename T, typename Functor, int size1, int size2 >
void construct_lcs(Direct ( & direct)[size1][size2],
T ( & r_str)[size1],
int i, int j, Functor functor) ... {
if ((0 == i) or (0 == j))
return;
if (kUpperRight == direct[i][j]) ...{
functor(r_str[i]);
construct_lcs(direct, r_str, i-1, j-1, functor);
} else
if (kUpper == direct[i][j])
construct_lcs(direct, r_str, i, j-1, functor);
else
if (kRight == direct[i][j])
construct_lcs(direct, r_str, i-1, j, functor);
}
struct print
... {
void operator()(char c) ...{ cout << c << " "; }
} ;