交替字符串
题目详情:
如果字符串str3能够由str1和str2中的字符按顺序交替形成,那么称str3为str1和str2的交替字符串。例如str1="abc",str2="def",那么"adbecf", "abcdef", "abdecf", "abcdef", "adefbc"等等都为str1和str2的交替字符串。更形式化的,str3的生成算法如下:
str3=""
while str1不为空 or str2不为空:
把str1或str2的首字符加入到str3,并从str1或str2中删除相应的字符
end
给定str1, str2,和str3,判断str3是否为str1和str2的交替字符串。
输入格式:
多组数据,每组数据三行,分别是str1,str2,str3。str1,str2的长度在[1..100]范围内,str3的范围在[1..200]范围内。字符串只包含小写英文字母。
输出格式:
每组数据输出一行YES或者NO。
答题说明:
输入样例
a
b
ab
a
b
ca
输出样例:
YES
NO
欠缺考虑(Error):
#include "stdio.h"
#include "string.h"
#define maxn 100+2char str1[maxn],str2[maxn],str3[maxn*2];int fun()
{int i1=0,size1=strlen(str1);int i2=0,size2=strlen(str2);int i3=0,size3=strlen(str3);//通过 str1和str2 顺序匹配 str3 ,匹配不到 return 0 while(i3<size3){if(i1<size1 && str3[i3]==str1[i1]){i1++;}else if(i2<size2 && str3[i3]==str2[i2]){i2++;}else {return 0;}i3++;}return 1;
}int main()
{while(scanf("%s%s%s",str1,str2,str3)){if(strlen(str1)+strlen(str2)==strlen(str3) && fun()){printf("YES\n");}else{printf("NO\n");}}return 0;
}
/*不通过的测试用例:12345 6278 162782345 错误原因:通过 str1和str2 按顺序进行匹配 str3 ,此程序的错就错在匹配这,即 str1和str2 对(str3中)某一个字符同时可以匹配时没有进行选择而是简单的用 str1中的字符去匹配
*/
修改后(AC):
#include "stdio.h"
#include "string.h"
#define maxn 100+2char str1[maxn],str2[maxn],str3[maxn*2];int fun(int i1,int i2,int i3)
{ if(i1>strlen(str1) || i2>strlen(str2) || i3>strlen(str3)) return 0;if(i1==strlen(str1) && i2==strlen(str2) && i3==strlen(str3)){return 1;}else if(str1[i1]==str2[i2] && str3[i3]==str1[i1]){return (fun(i1+1,i2,i3+1) || fun(i1,i2+1,i3+1));}else if(str3[i3]==str1[i1]){return fun(i1+1,i2,i3+1);}else if(str3[i3]==str2[i2]){return fun(i1,i2+1,i3+1);}else{return 0;}
}int main()
{while(scanf("%s%s%s",str1,str2,str3)){if(strlen(str1)+strlen(str2)==strlen(str3) && fun(0,0,0)){printf("YES\n");}else{printf("NO\n");}}return 0;
}
CSDN挑战编程交流群: 372863405