zoukankan      html  css  js  c++  java
  • CSDN编程挑战——《交替字符串》

    交替字符串

    题目详情:

    假设字符串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+2
     
    char 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
    ");
    		}else{
    			printf("NO
    ");
    		}
    	}
    	
    	return 0;
    } 
    /*
    	不通过的測试用例:
    		12345	6278	162782345 
    	
    	错误原因:
    		通过 str1和str2 按顺序进行匹配 str3 。此程序的错就错在匹配这。
    		
    		即 str1和str2 对(str3中)某一个字符同一时候能够匹配时没有进行选
    		
    		择而是简单的用 str1中的字符去匹配 
    */ 

    改动后(AC):

    #include "stdio.h"
    #include "string.h"
    #define maxn 100+2
     
    char 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
    ");
    		}else{
    			printf("NO
    ");
    		}
    	}
    	
    	return 0;
    } 

    CSDN挑战编程交流群:  372863405       

  • 相关阅读:
    Android smali 语法
    iOS 发布计费点测试
    how-to-stop-non-jailbroken-pirates-theory
    shell script
    文章收藏
    NB BAT批量读取图片文件属性
    JAVA LUHN
    MAC NDK 编译 Cocos2dx 问题
    Mac 下解压缩安装Android ndk bin 文件
    MVC Json输出调试信息
  • 原文地址:https://www.cnblogs.com/llguanli/p/7257681.html
Copyright © 2011-2022 走看看