传送门
题意:给出3个字符串a,b,c,问c是否的a,b穿插后的结果,也就是在a,b的字符顺序不改变的情况下组合在一起,a,b的字符串长度小于200
分析:直接深搜的话,复杂度是2^200,所以要用到记忆化,是空间也缓解时间,标记之前走过的情况。搜索中要记录a,b,c长度,c的长度等于ab长度的和,所以book[a][b]代表同一种情况,标记一下下次再走到这一步就return;
AC代码:
#include<bits/stdc++.h>
using namespace std;
int inf=0x3f3f3f3f;
int l1,l2,l3;
char a[210],b[210],c[420];
int book[210][210];
int flag;
void dfs(int t1,int t2,int t3)
{
if(t3==l3)
{
flag=1;
return;
}
if(book[t1][t2])
return;
book[t1][t2]=1;
if(a[t1]==c[t3])
dfs(t1+1,t2,t3+1);
if(b[t2]==c[t3])
dfs(t1,t2+1,t3+1);
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
memset(book,0,sizeof(book));
flag=0;
scanf("%s",a);
scanf("%s",b);
scanf("%s",c);
l1=strlen(a);
l2=strlen(b);
l3=strlen(c);
dfs(0,0,0);
if(flag==1)
printf("Data set %d: yes\n",i);
else printf("Data set %d: no\n",i);
}
}