1. 程式人生 > >hdu1501之dfs

hdu1501之dfs

Zipper

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5473    Accepted Submission(s): 1988


Problem Description Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.

For example, consider forming "tcraete" from "cat" and "tree":

String A: cat
String B: tree
String C: tcraete


As you can see, we can form the third string by alternating characters from the two strings. As a second example, consider forming "catrtee" from "cat" and "tree":

String A: cat
String B: tree
String C: catrtee


Finally, notice that it is impossible to form "cttaree" from "cat" and "tree".

Input The first line of input contains a single positive integer from 1 through 1000. It represents the number of data sets to follow. The processing for each data set is identical. The data sets appear on the following lines, one data set per line.

For each data set, the line of input consists of three strings, separated by a single space. All strings are composed of upper and lower case letters only. The length of the third string is always the sum of the lengths of the first two strings. The first two strings will have lengths between 1 and 200 characters, inclusive.


Output For each data set, print:

Data set n: yes

if the third string can be formed from the first two, or

Data set n: no

if it cannot. Of course n should be replaced by the data set number. See the sample output below for an example.

Sample Input 3 cat tree tcraete cat tree catrtee cat tree cttaree
Sample Output Data set 1: yes Data set 2: yes Data set 3: no
/*分析:對於字串a,b,c,由於c的長度一定是a和b的長度之和,所以對於用c匹配a,b到位置i,j
而匹配到i,j的方式可能很多,但是不管怎麼匹配到i,j的,c剩餘的字元一樣,a,b剩餘的也一樣,
所以i,j後的匹配結果一樣 
所以可以記憶化搜尋防止重複去求匹配i,j後的結果
mark[i][j]記憶a,b在i,j後的匹配情況,0表示沒匹配,1表示匹配成功,2表示匹配不成功 
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std;

const int MAX=200+10;
char a[MAX],b[MAX],c[2*MAX];
int mark[MAX][MAX];

int dfs(int i,int j,int k){
	if(mark[i][j])return mark[i][j];
	if(c[k] == '\0')return 1;
	mark[i][j]=2;//2表示訪問過但是不存在 
	if(a[i] == c[k])mark[i][j]=dfs(i+1,j,k+1);
	if(b[j] == c[k] && mark[i][j] != 1)mark[i][j]=dfs(i,j+1,k+1);//1表示訪問過且存在 
	return mark[i][j];
}

int main(){
	int t,num=0;
	scanf("%d",&t);
	while(t--){
		scanf("%s%s%s",a,b,c);
		memset(mark,0,sizeof mark);
		if(dfs(0,0,0) == 1)printf("Data set %d: yes\n",++num);
		else printf("Data set %d: no\n",++num);
	}
	return 0;
}