经典的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;
}