【LCS】最长公共子序列/子串

纠正一下题目

这道题求的是 最长 公共 子序列

区分一下子序列和子串:

名称 区别 样例(ABABCDD&AABCDED)
最长公共子序列 字符相等不必连续(中间可以断开) AABCDD
最长公共子串 字符必须是相等且连续的(中间不能断开) ABCD

由于缩写都是LCS,老师翻译时应该是翻译错了:

最长公共子序列(Longest Common Subsequence

最长公共子串(Longest Common Substring

要按照最长公共子序列的写法写哦!

不太会的可以参考这张图进行模拟

AC CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 3005
using namespace std;
int dp[MAXN][MAXN];
char s[MAXN], t[MAXN];
void print(int i, int j){
    
    //递归输出最长公共子序列。
	if(i == 0 || j == 0) return;
	if(s[i] == t[j]){
    
    
		print(i-1, j-1);
		putchar(s[i]);
	}
	else{
    
    
		if(dp[i-1][j] >= dp[i][j-1])
			print(i-1, j);
		else
			print(i, j-1);
	}
}
int main(){
    
    
	scanf("%s", s+1);
	scanf("%s", t+1);
	int sl = strlen(s+1);
	int tl = strlen(t+1);
	for(int i = 1; i <= sl; i++)
		for(int j = 1; j <= tl; j++)
			if(s[i] == t[j])dp[i][j] = dp[i-1][j-1]+1;
			else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
	print(sl, tl);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/skyflying266/article/details/125356167