1006 最长公共子序列Lcs + 打印路径

版权声明:转载请注明出处 https://blog.csdn.net/qq_37708702/article/details/89716877

题目链接
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

输出
输出最长的子序列,如果有多个,随意输出1个。

输入样例
abcicba
abdkscab

输出样例
abca

(搬运)视频讲解

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1e3 + 10;
int len1,len2,la,lb,cur,path[N],dp[N][N];//dp[i][j]表示的是str1的前i个字符,str2的前j个字符的最长公共子序列的长度 
char str1[N],str2[N];
int main(){	
	while(~scanf("%s%s",str1 + 1,str2 + 1)){
		memset(dp,0,sizeof dp);
		len1 = strlen(str1 + 1);
		len2 = strlen(str2 + 1);
		for(int i = 1;i <= len1;i++){
			for(int j = 1;j <= len2;j++){
				if(str1[i] == str2[j])
					dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + 1); 
				else
					dp[i][j] = max(dp[i][j - 1],dp[i - 1][j]);
			}
		}
		cur = 1,la = len1,lb = len2;
		while(dp[la][lb]){
			if(dp[la][lb] == dp[la - 1][lb]) la--;
			else if(dp[la][lb] == dp[la][lb - 1]) lb--;
			else{
				path[cur++] = la;
				la--,lb--;
			} 
		}		
		for(int i = cur - 1;i >= 1;i--) putchar(str1[path[i]]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37708702/article/details/89716877
今日推荐