最长公共子序列Lcs(打印路径)
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
#include <bits/stdc++.h> using namespace std; char a[1010],b[1010]; int dp[1010][1010]; string str=""; int path[1010][1010];//打印路径用,表示(i,j)节点是由那种状态转移过来的 void Lcs(int i,int j){ if(i==0||j==0){ return; } if(path[i][j]==1){ Lcs(i-1,j-1); printf("%c",a[i-1]); }else if(path[i][j]==2){ Lcs(i-1,j); }else{ Lcs(i,j-1); } return ; } int main(){ // freopen("in.txt","r",stdin); scanf("%s%s",a,b); for(int i=1;i<=strlen(a);i++){ for(int j=1;j<=strlen(b);j++){ if(a[i-1]==b[j-1]){ dp[i][j]=dp[i-1][j-1]+1; path[i][j]=1; }else if(dp[i-1][j]>dp[i][j-1]){ dp[i][j]=dp[i-1][j]; path[i][j]=2; }else{ dp[i][j]=dp[i][j-1]; path[i][j]=3; } } } // cout<<dp[strlen(a+1)][strlen(b+1)]<<endl; Lcs(strlen(a),strlen(b)); cout<<endl; return 0; }
我每天都在努力,只是想证明我是认真的活着.