HDU 1501 Zipper 字符串
题目大意:输入有一个T,表示有T组测试数据,然后输入三个字符串,问第三个字符串能否由第一个和第二个字符串拼接而来,拼接的规则是第一个和第二个字符串在新的字符串中的前后的相对的顺序不能改变,问第三个字符串能否由前两个得到。
解题报告:这题用dfs,反过来,将第三个字符串按照从前到后的顺序,看能否拆成第一个和第二个字符串,不过这题如果只是这样搜索的话,很明显会超时,所以要减掉其中一些重复的其情况,定义一个二维数组hash[i][j],初始化都为0,然后如果将hash[i][j]标记为1表示第一个字符串比较到第i个位置并且第二个字符串比较到第j个位置的情况已经搜索过了,要剪掉。这样就不会超时了,原理应该也比较简单吧。
1 #include<cstdio> 2 #include<cstring> 3 const int MAX = 400+5; 4 char A[MAX],B[MAX],C[MAX]; 5 int hash[MAX][MAX],len,len1,len2; 6 int ans,wrong; 7 void dfs(int i,int j,int k) { 8 if(ans) 9 return ; 10 if(C[k] == '\0') { 11 ans = true; 12 return; 13 } 14 if(!hash[i][j]) { 15 hash[i][j] = 1; 16 if(C[k] == A[i]) 17 dfs(i+1,j,k+1); 18 if(C[k] == B[j]) 19 dfs(i,j+1,k+1); 20 } 21 return ; 22 } 23 24 25 int main() { 26 int T,kase = 1; 27 scanf("%d",&T); 28 while(T--) { 29 scanf("%s%s%s",A,B,C); 30 len = strlen(C); 31 len1 = strlen(A); 32 len2 = strlen(B); 33 ans = false; 34 memset(hash,0,sizeof(hash)); 35 dfs(0,0,0); 36 printf(ans? "Data set %d: yes\n":"Data set %d: no\n",kase++); 37 } 38 return 0; 39 }