题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1501
题目大意:3个字符串a,b,c
a,b可以组成c(好像字符串a拆开,字母分别插入字符串b,和c相比较)就yes,否则no......
代码:
#include<iostream>
#include<string.h>
using namespace std;
char str1[1001],str2[1001],str3[2002]; //相当于 a,b,c
bool mark[1001][1001]; //作标记,来实现剪枝,不然可能会超时
int flag; //为最后的输出提供判断
int len1,len2,len3; //三个字符串长度
void init()
{
for(int i=0;i<=len1;i++)
for(int j=0;j<=len2;j++)
mark[i][j]=false;
}
void solve(int i,int j,int k)
{
if(k==len3-1) {flag=1;return ;} //是 len3-1 ,开始我写成 len1+len2-1了,以为 len1+len2=len3的
//cout<<str1[i]<<" "<<str2[j]<<" "<<str3[k]<<endl;
if(mark[i][j]) return ; //已经标记过了,直接返回
mark[i][j]=true;//标记
if(str1[i]!=str3[k] && str2[j] !=str3[k]) return ; //str1,str2和str3的字符都不相等,返回
if(i<len1 && str1[i]==str3[k]) solve(i+1,j,k+1); //str1[i]==str3[k]就判断 str[i+1]==str[k+1]?
if(j<len2 && str2[j]==str3[k]) solve(i,j+1,k+1); //str1[j]==str3[k]就判断 str[j+1]==str[k+1]?
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s%s%s",str1,str2,str3);
flag=0;
len1=strlen(str1),len2=strlen(str2),len3=strlen(str3);
init();
printf("Data set %d: ",i);
solve(0,0,0);
if(flag)
printf("yes/n");
else
printf("no/n");
}
return 0;
}