解析:可以当两个字符串相等时进行标记,并递归输出,详见代码。
#include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> using namespace std; const int N = 105; string s1[N],s2[N]; int dp[N][N]; bool flag[N][N]; int l1,l2; void print_path(int i,int j) { if(i == 0 || j == 0) { return ; } if(flag[i][j]) { print_path(i-1,j-1); cout << s1[i-1]; if(dp[i][j] != dp[l1][l2]) { cout << " "; } }else if(dp[i-1][j] > dp[i][j-1]) { print_path(i-1,j); }else { print_path(i,j-1); } } int main() { l1 = l2 = 0; while(cin >> s1[l1++]) { while(cin >> s1[l1] && s1[l1] != "#") { l1++; } while(cin >> s2[l2] && s2[l2] != "#") { l2++; } memset(dp,0,sizeof(dp)); memset(flag,false,sizeof(flag)); for(int i = 1; i <= l1; i++) { for(int j = 1; j <= l2; j++) { if(s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; flag[i][j] = true; }else { dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } print_path(l1,l2); cout << endl; l1 = l2 = 0; } return 0; }