输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
1 #include<algorithm> 2 #include<iostream> 3 #include<limits.h> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<complex> 7 #include<cstring> 8 #include<iomanip> 9 #include<stdio.h> 10 #include<bitset> 11 #include<cctype> 12 #include<math.h> 13 #include<string> 14 #include<time.h> 15 #include<vector> 16 #include<cmath> 17 #include<queue> 18 #include<stack> 19 #include<list> 20 #include<map> 21 #include<set> 22 23 #define LL long long 24 25 using namespace std; 26 const LL mod = 1e9 + 7; 27 const double PI = acos(-1.0); 28 const double E = exp(1.0); 29 const int M = 1e3 + 10; 30 31 string s1; 32 string s2; 33 string s; 34 int dp[M][M]; 35 36 37 int main() 38 { 39 while( cin >> s1 >> s2 ){ 40 int len1 = s1.size(); 41 int len2 = s2.size(); 42 s1 = "#" + s1; 43 s2 = "#" + s2; 44 memset(dp, 0, sizeof(dp)); 45 s.clear(); 46 for(int i = 1; i <= len1; ++i) 47 for(int j = 1; j <= len2; ++j){ 48 if(s1[i] == s2[j]) 49 dp[i][j] = dp[i - 1][j - 1] + 1; 50 else 51 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 52 } 53 for(int i = len1, j = len2; i && j; --i, --j){ 54 if(s1[i] == s2[j]) 55 s += s1[i]; 56 else{ 57 if(dp[i][j - 1] > dp[i - 1][j]) 58 i++; 59 else 60 j++; 61 } 62 } 63 if(dp[len1][len2] == 0) 64 continue; 65 for(int i = s.size() - 1; i >= 0; --i) 66 cout << s[i]; 67 cout << endl; 68 } 69 return 0; 70 }
浙公网安备 33010602011771号