问前两个字符串是否能组合成第三个字符串,保持原字符串的顺序。
看到别人的代码有两种做法:
1、DFS
hash数组标记足迹,可以减少重复搜索的次数。
这个代码太过巧妙,体会体会再体会。。
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 bool hash[205][205]; 8 char s1[205], s2[205], s3[410]; 9 10 bool DFS(int a, int b, int c) 11 { 12 if(s3[c] == '\0') 13 return true; 14 if(hash[a][b]) 15 return false; 16 hash[a][b] = true; 17 if(s1[a] == s3[c] && DFS(a+1, b, c+1)) 18 return true; 19 if(s2[b] == s3[c] && DFS(a, b+1, c+1)) 20 return true; 21 return false; 22 } 23 24 int main(void) 25 { 26 #ifdef LOCAL 27 freopen("1501in.txt", "r", stdin); 28 #endif 29 30 int T, kase; 31 scanf("%d", &T); 32 for(kase = 1; kase <= T; ++kase) 33 { 34 printf("Data set %d: ", kase); 35 cin >> s1 >> s2 >> s3; 36 memset(hash, false, sizeof(hash)); 37 if(DFS(0, 0, 0)) 38 printf("yes\n"); 39 else 40 printf("no\n"); 41 42 } 43 return 0; 44 }