#include <iostream>
#include <stack>
using namespace std;
#define MAX 999
#define BIG 101
char ca[BIG];
char cb[BIG];
int map[BIG][BIG];
int dire[BIG][BIG]; //记录上一个重合点在此时的方向???
stack<char> mark;
void LCS(int m, int n)
{
int sum = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (ca[i - 1] == cb[j - 1])
{
map[i][j] = map[i - 1][j - 1] + 1;
if (sum< map[i][j]) sum = map[i][j];
dire[i][j] = 0; //指向对角
}
else
{
if (map[i - 1][j] > map[i][j - 1])
{
map[i][j] = map[i - 1][j];
dire[i][j] = 1; //上面的大于左面的 指向上
}
else
{
map[i][j] = map[i][j - 1];
dire[i][j] = -1; //左边的大于上面的 指向左
}
}
}
}
cout << "最长公共子序列的长度是:" << sum << endl;
}
void LCSprint(int dire[][BIG], int i, int j)
{
if (i == 0 || j == 0) return;
if (dire[i][j] == 0)
{
mark.push(ca[i - 1]);
LCSprint(dire, i - 1, j - 1);
}
else if (dire[i][j] == 1)
{
LCSprint(dire, i - 1, j);
}
else
{
LCSprint(dire, i, j - 1);
}
}
int main()
{
while (cout << "输入两个字符串" << endl, gets_s(ca), gets_s(cb))
{
for (int i = 0; i < BIG; i++)
{
for (int j = 0; j < BIG; j++) dire[i][j]=map[i][j] = 0;
}
//
int m = strlen(ca);
int n = strlen(cb);
LCS(m, n); //计算最长公共子序列的长度
LCSprint(dire, m, n);//从末尾开始 输出公共点
while (!mark.empty())
{
cout << mark.top() << " ";
mark.pop();
}
cout << endl;
getchar();
}
return 0;
}
#include <stack>
using namespace std;
#define MAX 999
#define BIG 101
char ca[BIG];
char cb[BIG];
int map[BIG][BIG];
int dire[BIG][BIG]; //记录上一个重合点在此时的方向???
stack<char> mark;
void LCS(int m, int n)
{
int sum = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (ca[i - 1] == cb[j - 1])
{
map[i][j] = map[i - 1][j - 1] + 1;
if (sum< map[i][j]) sum = map[i][j];
dire[i][j] = 0; //指向对角
}
else
{
if (map[i - 1][j] > map[i][j - 1])
{
map[i][j] = map[i - 1][j];
dire[i][j] = 1; //上面的大于左面的 指向上
}
else
{
map[i][j] = map[i][j - 1];
dire[i][j] = -1; //左边的大于上面的 指向左
}
}
}
}
cout << "最长公共子序列的长度是:" << sum << endl;
}
void LCSprint(int dire[][BIG], int i, int j)
{
if (i == 0 || j == 0) return;
if (dire[i][j] == 0)
{
mark.push(ca[i - 1]);
LCSprint(dire, i - 1, j - 1);
}
else if (dire[i][j] == 1)
{
LCSprint(dire, i - 1, j);
}
else
{
LCSprint(dire, i, j - 1);
}
}
int main()
{
while (cout << "输入两个字符串" << endl, gets_s(ca), gets_s(cb))
{
for (int i = 0; i < BIG; i++)
{
for (int j = 0; j < BIG; j++) dire[i][j]=map[i][j] = 0;
}
//
int m = strlen(ca);
int n = strlen(cb);
LCS(m, n); //计算最长公共子序列的长度
LCSprint(dire, m, n);//从末尾开始 输出公共点
while (!mark.empty())
{
cout << mark.top() << " ";
mark.pop();
}
cout << endl;
getchar();
}
return 0;
}