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       

  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/llguanli/p/7257681.html
Copyright © 2011-2022 走看看