这个题思路很明显,就是将字符串每个单词处理为一个元素,然后进行LCS求解,再打印路径就好。
问题在于输出路径,这里我写的是直接逆序寻找路径,比较好写,还有一种是dp时就进行记录的,那个个人觉得很麻烦,就不写了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
string s;
vector<string> vt1,vt2;
int dp[105][105];
int main()
{
int num=0;
while(cin >> s)
{
if(s[0]=='#') num++;
if(num==0)
vt1.push_back(s);
if(num==1)
vt2.push_back(s);
if(num==2)
{
memset(dp,0,sizeof(dp));
for(int i=0; i<vt1.size(); i++)//这一段大家不要看了,存的有点乱
{
for(int j=0; j<vt2.size(); j++)
{
if(vt1[i]==vt2[j])
dp[i+1][j+1]=max(dp[i+1][j+1],dp[i-1+1][j-1+1]+1);
else
dp[i+1][j+1]=max(dp[i-1+1][j+1],dp[i+1][j-1+1]);
}
}
vector<string> ans;
int len1=vt1.size(),len2=vt2.size();
int cal=dp[len1][len2],l=len2-1;//设置cal为最大长度,即路径长度,l是标记查找到的位置,为了避免重复查找
for(int i=len1-1;i>=0;i--)//逆序查找路径
{
for(int j=l;j>=0;j--)
{
if(dp[i+1][j+1]==cal && vt1[i]==vt2[j])//路径的条件,除了对应元素相同,而且长度值也要符合
{
cal--;
l=j-1;
ans.push_back(vt1[i]);
break;
}
}
}
for(int i=ans.size()-1;i>=0;i--)//输出路径
{
if(i==0) cout << ans[i] <<endl;
else cout << ans[i] << " ";
}
vt1.clear();
vt2.clear();
num=0;
}
}
return 0;
}