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

本文介绍了一种使用深度优先搜索(DFS)算法来判断是否可以通过两个字符串按顺序拼接形成第三个目标字符串的方法。通过引入辅助数组进行剪枝操作避免重复搜索,提高了算法效率。
3034

被折叠的 条评论
为什么被折叠?



