强烈推荐这篇文章,讲的特别好:https://www.cnblogs.com/hapjin/p/5572483.html
下面是我的代码:C++写的
// 定义二维指针 0==左上 1==左边 2==上边
int findLCS(const vector<int> &rowVec, const vector<int> &colVec, int **cFlag)
{
int rowCnt = rowVec.size()+1;//7
int colCnt = colVec.size()+1;//6
int **c2Array=NULL;
//int **cFlag;// 定义二维指针 0==左上 1==左边 2==上边
c2Array = (int**)malloc(sizeof(int*)*(rowCnt));
for (int k = 0; k < rowCnt; k++)
{
c2Array[k] = (int*)malloc(sizeof(int)*(colCnt));
}
int lpi = 0;
int lpj = 0;
for (lpi = 0; lpi < rowCnt; lpi++)
{
c2Array[lpi][0] = 0;
cFlag[lpi][0] = 0;
}
for (lpj = 0; lpj < colCnt; lpj++)
{
c2Array[0][lpj] = 0;
cFlag[0][lpj] = 0;
}
for (lpi = 1; lpi < rowCnt; lpi++)
{
for (lpj = 1; lpj < colCnt; lpj++)
{
if (rowVec.at(lpi - 1) == colVec.at(lpj - 1))//左上
{
c2Array[lpi][lpj] = c2Array[lpi - 1][lpj - 1] + 1;
cFlag[lpi][lpj] = 0;
}
else if (c2Array[lpi - 1][lpj]>c2Array[lpi][lpj - 1])//上
{
c2Array[lpi][lpj] = c2Array[lpi - 1][lpj];
cFlag[lpi][lpj] = 2;
}
else//左
{
c2Array[lpi][lpj] = c2Array[lpi][lpj - 1];
cFlag[lpi][lpj] = 1;
}
}
}
cout << "findLCS --- begin --- " << endl;
for (int ix0 = 0; ix0 < rowCnt; ix0++)
{
cout << endl;
for (int ix1 = 0; ix1 < colCnt; ix1++)
cout << c2Array[ix0][ix1] << " ";
}
cout << endl<<"findLCS --- end --- " << endl;
int iret = c2Array[rowCnt-1][colCnt-1];;
for (int k = 0; k < rowCnt/* colCnt + 1*/; k++)
{
free(c2Array[k]);
}
free(c2Array);
return iret;
}
// 倒序查找 定义二维指针 0==左上 1==左边 2==上边
void printLCS(int **cFlag, const vector<int> &listVec, int i, int j, map<int, int> &mpRet)
{
if (i==0||j==0)
return;
if (cFlag[i][j] == 0) // 0==左上
{
mpRet[i-1] = j-1;
cout << listVec[j - 1] << " pos:" << i - 1 << " " << j - 1 << endl;
printLCS(cFlag, listVec, i - 1, j - 1, mpRet);
}
else
{
if (cFlag[i][j] == 2) //2==上边
{
printLCS(cFlag, listVec, i - 1, j, mpRet);
}
else// 1==左边
{
printLCS(cFlag, listVec, i, j - 1, mpRet);
}
}
}
int main()
{
vector<int> rowVec;
rowVec.push_back(3); rowVec.push_back(8);
rowVec.push_back(4); rowVec.push_back(5); rowVec.push_back(2); rowVec.push_back(4); rowVec.push_back(6);
vector<int> colVec;
colVec.push_back(3); colVec.push_back(1); colVec.push_back(3); colVec.push_back(2); colVec.push_back(3); colVec.push_back(4); colVec.push_back(5);
colVec.push_back(6); colVec.push_back(7);
int **cFlag=NULL;;
int rowCnt = rowVec.size() + 1;
int colCnt = colVec.size() + 1; // m行n列
cFlag = (int**)malloc(sizeof(int*)*rowCnt);
for (int k = 0; k < rowCnt; k++)
{
cFlag[k] = (int*)malloc(sizeof(int)*colCnt);
}
map<int, int> mpRet;//[rowPos,colPos]
mpRet.clear();
int iret2 = findLCS(rowVec,colVec, cFlag);
printLCS(cFlag, colVec, rowCnt - 1, colCnt - 1, mpRet);// rowCnt>=colCnt==row中的数据聚合在一起 rowCnt<colCnt==匹配的数据为列的第一个,不聚合
for (int k = 0; k < rowCnt; k++)
{
free(cFlag[k]);
}
free(cFlag);
cout << "hello world" << endl;
getchar();
return 0;
}