题目链接:http://poj.org/problem?id=1934
题目思路:哎,数组开小了,开始一直没看出来,晕啦。我的写法不是很好,其实可以用last1[i][j]表示字符i在第一个字符串的前j个字符中出现的最后位置,同理last2,这样就可以去重了,而且可以提高效率。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<set>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
set<string>st;
int last[88][88];
int dp[88][88];
vector<string>vt;
char str1[88],str2[88];
int len1,len2,ans;
void dfs(int a,int b,char rec[],int len)
{
int i;
int flag[27];
memset(flag,0,sizeof(flag));
if(len==0)
{
// st.insert(rec);
vt.push_back(rec);
return;
}
for(i=a;i<len1;i++)
{
if(last[i][b]!=-1&&dp[i][last[i][b]]==len&&!flag[str1[i]-'a'])
{
flag[str1[i]-'a']=1;
char tmp[88];
strcpy(tmp,rec);
tmp[ans-len]=str1[i];
tmp[ans-len+1]=0;
dfs(i+1,last[i][b]+1,tmp,len-1);
}
}
}
int main()
{
int i,j;
while(scanf("%s%s",str1,str2)!=EOF)
{
len1=strlen(str1);
len2=strlen(str2);
dp[len1-1][len2]=dp[len1][len2-1]=0;
dp[len1-1][len2-1]=0;
st.clear();
memset(last,-1,sizeof(last));
for(i=len1-1;i>=0;i--)
{
for(j=len2-1;j>=0;j--)
{
if(str1[i]==str2[j])
last[i][j]=j;
else
last[i][j]=last[i][j+1];
dp[i][j]=max(dp[i+1][j],dp[i][j+1]);
if(str1[i]==str2[j])
{
dp[i][j]=max(dp[i][j],dp[i+1][j+1]+1);
}
}
}
ans=dp[0][0];
char rec[12];
dfs(0,0,rec,ans);
sort(vt.begin(),vt.end());
for(i=0;i<vt.size();i++)
cout<<vt[i]<<endl;
}
return 0;
}