LCS

强烈推荐这篇文章,讲的特别好: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值