题目大意:输入两段文字,每段文字以'#'结束,要求你求出这两段文字中最长公共的单词,并输出。
解析:可以当两个字符串相等时进行标记,并递归输出,详见代码。
#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;
}