英雄会 - 字符串交替

深度抽象 2014-03-13 09:08:37
本人的代码如下:
#include <iostream>

using namespace std;
char str1 [101] ;int len1 = 0 ;
char str2 [101] ;int len2 = 0 ;
char str3 [201] ;int len3 = 0 ;

bool getRes(int i3,int i1,int i2)
{
if(i3 == len3 && i1 == len1 && i2 == len2)return true ;
if(i3 > len3 || i1 > len1 || i2 > len2)return false ;
bool res = false ;
if(str3[i3] == str1[i1])res = getRes(i3+1,i1+1,i2);
if((!res)&&str3[i3] == str2[i2])res = getRes(i3+1,i1,i2+1);
return res ;
}
int main()
{
while(cin>>str1>>str2>>str3)
{
len1 = strlen(str1) ;
len2 = strlen(str2) ;
len3 = strlen(str3) ;
if(getRes(0,0,0))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}

实在想不出其他的漏洞了,请大神指教。
...全文
222 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你不能先判断str3是否等于str1,不等在判断str3是否等str2。反过来也不行,试试这个输入str1="aababc",str2=“abcaab",str3="abaabcabaaabc",你的是NO吗?其实是YES。问题就在于当str1[i]==str2[j]的时候,要像大神一样return fun(s1, s2, s3, i1+1, i2, i3+1) || fun(s1, s2, s3, i1, i2+1, i3+1);
深度抽象 2014-03-14
  • 打赏
  • 举报
回复
引用 10 楼 dbzhang800 的回复:
简单写了一下

#include <iostream>
#include <string>

using namespace std;

bool fun(const string &s1, const string &s2, const string &s3, int i1=0, int i2=0, int i3=0)
{
    if (s1.size() + s2.size() != s3.size())
        return false;

    if (s1.size() == i1)
        return s2.substr(i2) == s3.substr(i3);
    if (s2.size() == i2)
        return  s1.substr(i1) == s3.substr(i3);

    if (s3[i3] == s1[i1] && s3[i3] == s2[i2])
        return fun(s1, s2, s3, i1+1, i2, i3+1) || fun(s1, s2, s3, i1, i2+1, i3+1);
    else if (s3[i3] == s1[i1])
        return fun(s1, s2, s3, i1+1, i2, i3+1);
    else if (s3[i3] == s2[i2])
        return fun(s1, s2, s3, i1, i2+1, i3+1);
    else
        return false;
}

int main()
{
    cout<<fun("a", "b", "ab")<<true<<endl;
    cout<<fun("a", "b", "ba")<<true<<endl;
    cout<<fun("a", "b", "bac")<<false<<endl;
    cout<<fun("abc", "bcd", "abcdbc")<<true<<endl;
    cout<<fun("abc", "bcd", "abcbcd")<<true<<endl;
    cout<<fun("abcbc", "bcd", "abcbcdbc")<<true<<endl;

    return 0;
}
正解!看来我的边界条件找的有问题啊
dbzhang800 2014-03-14
  • 打赏
  • 举报
回复
简单写了一下

#include <iostream>
#include <string>

using namespace std;

bool fun(const string &s1, const string &s2, const string &s3, int i1=0, int i2=0, int i3=0)
{
    if (s1.size() + s2.size() != s3.size())
        return false;

    if (s1.size() == i1)
        return s2.substr(i2) == s3.substr(i3);
    if (s2.size() == i2)
        return  s1.substr(i1) == s3.substr(i3);

    if (s3[i3] == s1[i1] && s3[i3] == s2[i2])
        return fun(s1, s2, s3, i1+1, i2, i3+1) || fun(s1, s2, s3, i1, i2+1, i3+1);
    else if (s3[i3] == s1[i1])
        return fun(s1, s2, s3, i1+1, i2, i3+1);
    else if (s3[i3] == s2[i2])
        return fun(s1, s2, s3, i1, i2+1, i3+1);
    else
        return false;
}

int main()
{
    cout<<fun("a", "b", "ab")<<true<<endl;
    cout<<fun("a", "b", "ba")<<true<<endl;
    cout<<fun("a", "b", "bac")<<false<<endl;
    cout<<fun("abc", "bcd", "abcdbc")<<true<<endl;
    cout<<fun("abc", "bcd", "abcbcd")<<true<<endl;
    cout<<fun("abcbc", "bcd", "abcbcdbc")<<true<<endl;

    return 0;
}
深度抽象 2014-03-14
  • 打赏
  • 举报
回复
没有大神了吗?大神你们都去哪了?
深度抽象 2014-03-13
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 这数据你就死了。
我已经改为下面的代码了,但是还是过不了,实在是不知道这个边界条件,好混乱啊。 现在觉得只要是能 满足条件(1) 就是正确答案,不知道这样分析是不是考虑的不周全,拜托高手指点一下。
#include <iostream>

using namespace std;
char str1 [101] ;int len1 = 0 ;
char str2 [101] ;int len2 = 0 ;
char str3 [201] ;int len3 = 0 ;
bool res = false ;
void getRes(int i3,int i1,int i2)
{
    if(i3 == len3 && i1 == len1 && i2 == len2){res = true ;return  ;} //条件(1)
    else if(i3 == len3 && (i1 != len1 || i2 != len2))return;
    if(i3 > len3 || i1 > len1 || i2 > len2)return  ;
    if(str3[i3] == str1[i1])getRes(i3+1,i1+1,i2);
    if(str3[i3] == str2[i2])getRes(i3+1,i1,i2+1);
    return   ;
}
int main()
{
    while(cin>>str1>>str2>>str3)
    {
        len1 = strlen(str1) ;
        len2 = strlen(str2) ;
        len3 = strlen(str3) ;
        res = false;
        getRes(0,0,0);
        if(res)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
深度抽象 2014-03-13
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 这数据你就死了。
你的这组数据的确死循环了。现在正在研究。
深度抽象 2014-03-13
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
谁保证输入的字符串长度不超过100个字符?
题目中给了保证的。。。
FancyMouse 2014-03-13
  • 打赏
  • 举报
回复
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 这数据你就死了。
赵4老师 2014-03-13
  • 打赏
  • 举报
回复
谁保证输入的字符串长度不超过100个字符?
深度抽象 2014-03-13
  • 打赏
  • 举报
回复
求大神现身说法,,,
深度抽象 2014-03-13
  • 打赏
  • 举报
回复
引用 6 楼 buyong 的回复:
1. 需求不清 2. c++ 一般用 std::string
题目如下:

题目详情

如果字符串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
链接:http://hero.csdn.net/?ref=toolbar
buyong 2014-03-13
  • 打赏
  • 举报
回复
1. 需求不清 2. c++ 一般用 std::string

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧