hdu1501Zipper -- 经典DFS

经典的DFS

题意:有3个字符串,问第三个字符串能否有前2个字符串拼接起来,拼接时前2个字符串中字符在新字符串中的先后相对位置不能改变。

思路:DFS,前2个字符串,从前向后搜索看能否能拼成第三个字符串的顺序,另外我们需要增加一个辅助数组进行剪枝操作,不然会有重复的搜索的。

m_hash[i][j] = 1 表示第一个数组的第i位比较到第2个数组的第j位时已经被搜索过了,以后若遇到m_hash[i][j]=1直接返回,除去不必要的搜索。

#include <iostream>
using namespace std;

#define N 210
char str1[N];
char str2[N];
char str3[2 * N];
char m_hash[N][N]; //m_hash[i][j] = 1表示第一个字符串的第i个字符已经比较到了第二个字符串的第j个字符,已经不用再搜索了。
bool dfs(char str1[], char str2[], char str3[], int x, int y, int cur)
{
	if (str3[cur] == 0)
	{
		return true;
	}
	if (m_hash[x][y])
	{
		return false;
	}

	m_hash[x][y] = true;

	if (str1[x] == str3[cur] && dfs(str1, str2, str3, x + 1, y, cur + 1)) 
	{
		return true;
	}

	if (str2[y] == str3[cur] && dfs(str1, str2, str3, x, y + 1, cur + 1)) 
	{
		return true;
	}

	return false;
}

int main()
{
	int t, k = 1;
	bool res; 
	scanf("%d", &t);
	while(t--)
	{
		scanf("%s %s %s", str1, str2, str3);
		memset(m_hash, 0, sizeof(m_hash));
		res = dfs(str1, str2, str3, 0, 0, 0);
		printf("Data set %d: %s\n", k++, !res?"no":"yes");
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值