最長公共子序列(略有瑕疵,要複習,不管了)

#include
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章