2.分析
这个题目不难,拿上来首先想到的就是从前往后遍历str3,依次和str1、str2匹配,这主要是考验对指针的应用熟练程度。
这里需要注意的就是当str3对应的字符和str1、str2对应的字符都相等时应该匹配哪一个,如下
str1:abcd
str2:dce
str3:abcdced
匹配的时候首先str3的‘abc’和str1的‘abc’匹配,接下来就是str3的‘d’和str1的‘d’还是str2的‘d’匹配的问题,这两种结果是不一样的,所以这里我们要考虑两种情形下的匹配结果,具体代码实现使用递归向下分叉的方式,具体程序稍后给出。
3.实现代码
#include <stdio.h>
#include <string.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0
BOOL a(char *str1, char *str2, char *str3)
{
int length1, length2, length3;
char *p1, *p2, *p3;
//计算各个字符串长度
length1 = strlen(str1);
length2 = strlen(str2);
length3 = strlen(str3);
//首先要满足字符串1、2的长度和等于字符串3的长度
if (length3 != length1 + length2)
{
return FALSE;
}
p1 = str1;
p2 = str2;
p3 = str3;
while (p3[0] != '\0')
{
if (p1[0] != '\0' && p2[0] != '\0' && p3[0] == p1[0] && p3[0] == p2[0])
{
//相等的情况时向下分叉只要有一个匹配成功即为成功
return (a(p1+1, p2, p3+1) | a(p1, p2+1, p3+1));
}
else if (p1[0] != '\0' && p3[0] == p1[0])
{
p3++;
p1++;
continue;
}
else if(p2[0] != '\0' && p3[0] == p2[0])
{
p3++;
p2++;
continue;
}
else
{
return FALSE;
}
}
return TRUE;
}
int main()
{
char str1[101];
char str2[101];
char str3[201];
//循环获得输入
while(gets(str1) != NULL)
{
gets(str2);
gets(str3);
//输出结果
printf("%s\n", TRUE == a(str1, str2, str3) ? "YES" : "NO");
}
return 0;
}