求高手帮忙做一题算法题,字符串合并

dingdangmimi 2011-05-19 10:37:34
算法题:
★问题描述
给定一个字符串,要求判断它是否能由其它两个字符串合并而成。当两个字符串合并成一个新的字符串时,新串的字符顺序必须与原串中的顺序相一致。
★实验任务
判断给定字符串是否能由其它两个字符串合并而得到。
★数据输入
输入数据有三行,第一行给出字符串T(T的长度在1至2000之间),接下来两行分别给出字符串X和Y,(X和Y的长度均在1至1000之间。
所有字符串只由a-z这26个字母构成。
★数据输出
输出只有一行,如果字符串T能够由X和Y合并得到,则输出“Yes”,否则,输出“No”。
输入文件示例1 输出文件示例1
abbccbaz
abcb
bcaz Yes
输入文件示例2 输出文件示例2
bacbac
abc
abc No

要求用c++语言编程。vc++6.0环境下编译通过。使用标准输入输出语言(cin,cout),不要读写文件
...全文
686 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccnahby 2011-05-21
  • 打赏
  • 举报
回复
hby(a,i+1,b,j,c,k+1,state);
改为 hby(a,i+1,b,j,c,k+1,h);

ccnahby 2011-05-21
  • 打赏
  • 举报
回复
来个简单直观点的

#include<iostream.h>
#include<string.h>

void hby(const char* a,int i,const char* b,int j,const char* c,int k,bool& h)
{
if(i==9)
{
h=true;
return;
}

if(a[i]==b[j]&&j<4)
hby(a,i+1,b,j+1,c,k,state);
if(a[i]==c[k]&&k<5)
hby(a,i+1,b,j,c,k+1,state);
return;
}

int main()
{
char a[10]="abcbccbaz",b[5]="abcb",c[6]="bmmaz";
bool h=false;
hby(a,0,b,0,c,0,h);
cout<<(h?"yes":"no")<<endl;
return 0;
}
新手 。。有错莫怪....
ccnahby 2011-05-21
  • 打赏
  • 举报
回复
貌似 好多人都 看错了题目0.0....
liurenwu 2011-05-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using namespace std;

bool test(char *t,char *x,char *y,int tpos,int xpos,int ypos)
{
if(tpos==0)
return true;

if(xpos>=0&&t[tpos]==x[xpos])
if(test(t,x,y,tpos-1,xpos-1,ypos))
return true;

if(ypos>=0&&t[tpos]==y[ypos])
if(test(t,x,y,tpos-1,xpos,ypos-1))
return true;

return false;
}

int main()
{
char *t="abbccbaz";
char *x="abcb";
char *y="bcaz";
if(test(t,x,y,strlen(t)-1,strlen(x)-1,strlen(y)-1))
cout<<"OK";
else
cout<<"NO";
getchar();
return 0;
}
zhaowei1334 2011-05-20
  • 打赏
  • 举报
回复
这是用C语言写的,我不会C++;


#include<stdio.h>
#include<string.h>

void Compare(char* DemoString,char* TestString1,char* TestString2);
void main()
{
char DemoString[20] = {0};

scanf("%s",DemoString);

printf("\n");

char TestString1[10] = {0};

char TestString2[10] = {0};

scanf("%s",TestString1);

scanf("%s",TestString2);

printf("\n\n");


Compare(DemoString,TestString1,TestString2);

return;



}

void Compare(char* DemoString,char* TestString1,char* TestString2)
{
int Demo_length = strlen(DemoString);

int Test1_length = strlen(TestString1);

int Test2_length = strlen(TestString2);

if(Demo_length = Test1_length + Test2_length)
{
char Buffer[20] = {0};

strcat(Buffer,TestString1);
strcat(Buffer,TestString2);

if(!strcmp(Buffer,DemoString))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
else
{
printf("NO\n");
}
}
CCaway 2011-05-19
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
using namespace std;
void string_match_Q(const string& str0,size_t i,const string& str1,size_t j,const string& str2,size_t k,bool& state)
{
if(i==str0.size())
{
state=true;
return;
}

if(str0[i]==str1[j]&&j<str1.size())
{
string_match_Q(str0,i+1,str1,j+1,str2,k,state);
}
if(str0[i]==str2[k]&&k<str2.size())
{
string_match_Q(str0,i+1,str1,j,str2,k+1,state);
}
return;
}

int main()
{
cout<<"please input tree strings"<<endl;
string str[3];
for(unsigned int i=0;i<3;i++)
cin>>str[i];
bool state=false;
if(str[0].size()!=str[1].size()+str[2].size())
cout<<"no"<<endl;
else
string_match_Q(str[0],0,str[1],0,str[2],0,state);
cout<<(state?"yes":"no")<<endl;
return 0;
}
能力有限有不足之处,请指出
fight_flight 2011-05-19
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
using namespace std;

bool fun2(const string& s1,int pos1,const string& s2,int pos2,const string& s3,int pos3){
if(pos1==s1.size()&&pos2==s2.size()&&pos3==s3.size())return true;
else if((pos1==s1.size()&&(pos2<s2.size()||pos3<s3.size()))||s1[pos1]!=s2[pos2]&&s1[pos1]!=s3[pos3])return false;
int p1=pos1,p2=pos2,p3=pos3;
bool f1,f2;
while(p1<s1.size()&&p2<s2.size()&&s1[p1]==s2[p2])
++p1,++p2;
f1=fun2(s1,p1,s3,p3,s2,p2);
if(f1)return true;
p1=pos1,p2=pos2;
while(p1<s1.size()&&p3<s3.size()&&s1[p1]==s3[p3])
++p1,++p3;
if(p1==pos1)return false;
f2=fun2(s1,p1,s2,p2,s3,p3);
if(f1||f2)return true;
return false;
}


void fun1(const string& s1,const string& s2,const string& s3){
bool f=fun2(s1,0,s2,0,s3,0);
if(f)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}

int main(){
string s1="aa";
string s2="a";
string s3="ab";
fun1(s1,s2,s3);
return 0;
}

代码应该可以,不过没严格测试,就是看着比较恶心啊
huangyannew 2011-05-19
  • 打赏
  • 举报
回复
所以每次遇见2个字符串都能匹配的时候就要分2种情况。
huangyannew 2011-05-19
  • 打赏
  • 举报
回复
考虑这样的输入
abcdfd
acd
bdf
或者
avdefe
ade
vef
结果应该是对的
内存溢出 2011-05-19
  • 打赏
  • 举报
回复
mark!
qingkongxiaoyang 2011-05-19
  • 打赏
  • 举报
回复
有那么麻烦吗?
是我理会错了意思吗?
#include <iostream>
#include <string>
using namespace std;

int main()
{
cout<<"请输入原始串:"<<endl;
string str;
cin>>str;
cout<<"请输入两个子串:"<<endl;
string sub1,sub2;
cin>>sub1>>sub2;
string sub3 = sub1.append(sub2);
if(str.compare(sub3) == 0)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}

return 0;
}

Dingpotian 2011-05-19
  • 打赏
  • 举报
回复
//字符串合并
//StringMerge.cpp
#include<iostream>
#include<string>
using namespace std;

bool TestStringM(string t,string x,string y)
{
if(t.size()!=x.size()+y.size()) return false;
if(0==t.size() && 0==x.size() && 0==y.size())return true;
if(0==y.size())
return t==x;
if(0==x.size())
return t==y;
if(t[0]==x[0])
return TestStringM(t.erase(t.begin()),x.erase(x.begin()),y);
if(t[0]==y[0])
return TestStringM(t.erase(t.begin()),x,y.erase(y.begin()));
return false;
}

void main()
{
string t="hello";
string x="";
string y="eelo";
if(TestStringM(t,x,y))
cout<<"OK"<<endl;
}

有什么不足请指正!
herolijiang311 2011-05-19
  • 打赏
  • 举报
回复
我上面算法只考虑了:X Y字符串合并后各字符之和与T相同情况;需要再前面加上判断语句合并后各字符之和与T不相同情况;
huangyannew 2011-05-19
  • 打赏
  • 举报
回复

while(*strs)
{
if(*strs==*strc1)
++strc1;
else if(*strs==*strc2)
++strc2;
else
{
cout<<"NO";
return 0;
}
++strs;
}
if(*strc1==0&&*strc2==0)
cout<<"YES";
else
cout<<"NO";

理解错题目了?
herolijiang311 2011-05-19
  • 打赏
  • 举报
回复
有个复杂度为O(n*k) 0<k<n;
算法思路:遍历子串X,把每个字符出现在字符串T里的字符删除(关键一点是:只能往剩下的字符进行删除,比如X中abcb遍历到第二个b时只能在字符串T:abbccbaz中c后面查找b并删除,不能删除前面abb的第二个b);这样遍历完子字符串X时T剩下的如果是Y字符串 就证明X合并Y能得到T;否则NO; 以题中例子解释:abbccbaz删除操作后得bcaz就是Y;输出YES;例子二:bacbac按此算法删除X:abc后得:bca不等于Y 输出NO
这里的数据结构用链表合适,数组执行删除操作元素需要前移后退操作时间复杂度太大;

qq120848369 2011-05-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;

bool _findString(const string &first,const string &second,const string &object,size_t pos1,size_t pos2,size_t pos3)
{
if(pos3==object.size())
{
return true;
}

bool isFound=false;

if(pos1!=first.size() && first[pos1]==object[pos3])
{
isFound=isFound||_findString(first,second,object,pos1+1,pos2,pos3+1);
}
else
{
size_t pos=pos2;

while(pos!=second.size() && second[pos]!=object[pos3])
{
++pos;
}

if(pos!=second.size())
{
isFound=isFound||_findString(first,second,object,pos1,pos+1,pos3+1);
}
}

return isFound;
}

bool findString(const string &first,const string &second, const string &object)
{
return _findString(first,second,object,0,0,0);
}

int main()
{
string first,second,object;

cin>>object>>first>>second;

cout<<findString(first,second,object)<<endl;

return 0;
}


这个代码也能跑,不过我最初的意图并不是楼主的题意,我写的算法更加通用,即便两个串顺序不变是Object的子串我也能找出来...

根据楼主题意的算法就是先检查X+Y=Z的长度否,等于的话再继续:

如果first[i]匹配object[k]则匹配first[i],如果second[j]匹配就匹配object[k],如果都不匹配,那就匹配不了了,因为实在浪费不得任何一个字母,因为是有顺序要求的,而且长度和要相等,你懂的.
dingdangmimi 2011-05-19
  • 打赏
  • 举报
回复
:)对,第一行=第二行+第三行。
qq120848369 2011-05-19
  • 打赏
  • 举报
回复
哥理解错题意了,哥想的比你们多了很多,真蛋疼.
qq120848369 2011-05-19
  • 打赏
  • 举报
回复
额,第一行是目标...
qq120848369 2011-05-19
  • 打赏
  • 举报
回复
那abc是干嘛用的。

这里不是:
X=bacbac
Y=abc

然后X和Y合并之后能找出abc么,这不明摆着能找出来么。
加载更多回复(5)

64,639

社区成员

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

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