最长公共子序列

最长公共子序列问题(Longest Common Subsequence,LCS),给定序列在这里插入图片描述,求 X 和 Y 的最长公共子序列

Xi=<x1,x2,…,xi>
Yj=<y1,y2,…,yj>
Zk=<z1,z2,…,zk>
如果Zk是Xi和Yj的最长公共子序列
(1)xi = yj,那么zk = xi = yj,Zk-1是Xi-1和Yj-1的最长公共子序列
(2)xi ≠ yj,那么zk ≠ xi,Zk-1是Xi-1和Yj的最长公共子序列
(3)xi ≠ yj,那么zk ≠ yi,Zk-1是Xi和Yj-1的最长公共子序列


#include<iostream>
using namespace std;
 
int lcs[100][100]; //
char track[100][100]; //
char S[100], T[100]; 
 
 
void LCS(int slen, int tlen) {
	int i, j;
 
	//初始化矩阵
	for (i = 0; i <= slen; i++) lcs[i][0] = 0; 
	for (i = 0; i <= tlen; i++) lcs[0][i] = 0;
 
 
	for(i=1;i<=slen;i++)
		for (j = 1; j <= tlen; j++) {
			if (S[i] == T[j]) {
				lcs[i][j] = lcs[i - 1][j - 1] + 1;
				track[i][j] = 'Q';  // 左上
			}
 
			if (S[i] != T[j]) {
				if (lcs[i - 1][j] >= lcs[i][j - 1]) {
					lcs[i][j] = lcs[i - 1][j];
					track[i][j] = 'W'; // 上
				}
				else {
					lcs[i][j] = lcs[i][j - 1];
					track[i][j] = 'A'; // 左
				}
			}
		}
}
 
void printLcs(int slen,int tlen) {
	int i, j;
	char q[100]; //存储LCS串的栈
	int top = 0; //栈顶
	i = slen;
	j = tlen;
	cout << "length:" << lcs[i][j] << endl;
	cout << "LCS:";
	while (i != 0 && j != 0) {
		if (track[i][j] == 'Q') {
			q[++top] = T[j];
			i--;
			j--;
		}
		else if (track[i][j] == 'A') {
			j--;
		}
		else {
			i--;
		}
	}
 
	while (top != 0)cout << q[top--]; 
 
int main() {
	int n, m, i;
	cin >> n >> m;
	for (i = 1; i <= n; i++)cin >> S[i];
	for (i = 1; i <= m; i++)cin >> T[i];
 
	LCS(n, m);
	printLcs(n, m);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值