文章目录

潘少的 BLOG

诗酒趁年华

X

ACM刷题之-POJ-2192(Zipper)

  panjf2000

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

我的答案

#include<iostream>
using namespace std;
 
char A[201];
char B[201];
char C[401];
 
int N; /* 测试次数 */
 
int DFS(int x, int y)
{
    if(x == -1 && y == -1)
        return 1;
    if(x >= 0 && A[x] == C[x+y+1])
    {
        if(DFS(x-1,y))
            return 1;
    }
    if(y >= 0 && B[y] == C[x+y+1])
    {
        if(DFS(x,y-1))
            return 1;
    }
    return 0;
}
 
int main()
{
    scanf("%d", &N);
    for(int k = 1; k <= N; ++k)   /* N个测试用例 */
    {
        scanf("%s %s %s", A, B, C);
        printf("Data set %d: %s\n", k, DFS(strlen(A)-1,strlen(B)-1) ? "yes" : "no");
    }
    return 0;
}


微信公众号

潘建锋

关于版权和转载

本文由 潘建锋 创作,采用 署名 4.0 国际 (CC BY 4.0) 国际许可协议进行授权。
本站文章除注明转载/出处外,均为本站原创或翻译,转载时请务必署名,否则,本人将保留一切追究责任的权利。
署名 4.0 国际 (CC BY 4.0)

转载规范

标题:ACM刷题之-POJ-2192(Zipper)
作者:潘建锋
原文:https://taohuawu.club/POJ-2192

关于留言和评论

如果您对本文《ACM刷题之-POJ-2192(Zipper)》的内容有任何疑问、补充或纠错,欢迎在下面的评论系统中留言,与作者一起交流进步,谢谢!(~ ̄▽ ̄)~