#include<iostream>
#include <set>
#include <string>
using namespace std;
char str[100] = {0};
set<string> st;
void Show(int** LCS,int m,int n,const char* str1,const char* str2,int index)
{
if(m == 0 || n == 0)
{
//string ss = str;
//st.insert(ss);
cout << str << endl;
return;
}
// 比较 对应的字母
if(str1[m-1] == str2[n-1])
{
str[--index] = str1[m-1]; // 把str1[m-1] 存到 后面
Show(LCS,m-1,n-1,str1,str2,index);
}
else if(LCS[m-1][n] == LCS[m][n-1])
{
Show(LCS,m-1,n,str1,str2,index);
Show(LCS,m,n-1,str1,str2,index);
}
else if(LCS[m-1][n] > LCS[m][n-1])
{
Show(LCS,m-1,n,str1,str2,index);
}
else
{
Show(LCS,m,n-1,str1,str2,index);
}
}
void LCS(const char* str1,const char* str2)
{
int m = strlen(str1)+1;
int n = strlen(str2)+1;
// 创建LCS 数组
int** lcs = new int*[m];
for (int i=0;i<m;i++)
{
lcs[i] = new int[n];
memset(lcs[i],0,4*n);
}
// 计算 lcs 长度
for (int i=1;i<m;i++)
{
for (int j=1;j<n;j++)
{
if (str1[i-1] == str2[j-1]) // 看 str1 和 str2 对应的字母
{
lcs[i][j] = lcs[i-1][j-1]+1;
}
else if(lcs[i][j-1] > lcs[i-1][j]) // 看 行 或 列 哪个值大
{
lcs[i][j] = lcs[i][j-1];
}
else
{
lcs[i][j] = lcs[i-1][j];
}
}
}
// 查看
for (int i=1;i<m;i++)
{
for (int j=1;j<n;j++)
{
cout << lcs[i][j] << " ";
}
cout << endl;
}
cout << "LCS 长度:" << lcs[m-1][n-1] << endl;
Show(lcs,m-1,n-1,str1,str2,lcs[m-1][n-1]);
// 删除数组
for(int i=0;i<m;i++)
delete lcs[i];
delete lcs;
}
int main()
{
//LCS("ABCBDAB","BDCABA");
LCS("CABBDAB","ABDCBA");
set<string>::iterator ite ;
for(ite = st.begin();ite!=st.end();ite++)
cout << *ite << endl;
system("pause");
return 0;
}