题目:51node 1006
题意:找出公共子序列并输出,若有多个,输出一个就行
方法:先用一个二维数组dp[i][j]记录字符串 s1,s2长度分别为i和j时的最长公共子序列,在根据二维数组的值回溯;
代码:
#include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; int dp[1010][1010]; char s[1010][1010]; string ss = ""; int main() { string s1,s2; cin >> s1 >> s2; int len1 = s1.length(); int len2 = s2.length(); memset(dp,0,sizeof(dp)); for(int i = 1;i <= len1;++i){ for(int j = 1;j <= len2;++j){ if( s1[i-1]==s2[j-1] ) dp[i][j] = dp[i-1][j-1]+1; else { dp[i][j] = max(dp[i-1][j],dp[i][j-1]); // dp[i][j] = max(dp[i][j],dp[i-1][j-1]); } } } while( dp[len1][len2]>0 ) { if( dp[len1][len2]==dp[len1-1][len2] ){ len1--; } else if( dp[len1][len2]==dp[len1][len2-1] ){ len2--; } else{ ss.insert(0,string(1,s1[len1-1])); //string(num,str)代表生成一个字符串,包含num个str字符;每次插入的位置是第一个,因为是从后往前存 len1--; len2--; } } // cout << dp[len1][len2] << endl; cout << ss << endl; return 0; }