C-现在项目中有一些字符串,需要判断包含关系和合并序列。
首先两个字符串string1=“ab”和字符串string2=“c”,他们的合并关系指输出所有的组合,这个例子应该输出:abc,acb,cab(每一个字符串的元素相对位置不变)。
给定了一个字符串string3=“abc”,怎么按照上面说的合并规则确定string3是不是string1和string2的一个合并关系呢?处理的比较多,求高效的思路。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1.首先判断string1和string2是否同时包含在string3中,如果否直接判断不是;
2.如果上一步判断为是,则进一步判断两者在string3中出现的位置是不是有重合的部分,如果有重合,则判断为不是,否则判断为是;
我觉得你可以将string1和string2,转换为数组并合成一个数组,再和string3转换的数组进行对比若完全相等,则符合合并关系。
假设两个字符串分别是string1和string2,长度分别是M和N, 合并得到的字符串为string3;
1:问题中要求每一个字符串的元素相对位置不变,那么string3的首字符要么是string1[0]要么是string2[0];
那么string3字符串的规律就是这样的:
string1[0] + (string1[1…M-1]和string2[0…N-1]字符串合并)
string2[0] + (string1[0…M-1]和string2[1…N-1]字符串合并)
2:1中描述的粗体部分仍然可以看做此问题,第一个字符串的第一个字符+…..,和第二个字符串的第一个字符+…; 这样问题就转化为一个递归问题了。
3:第二个问题,给定str1,str2,str3,由于字符串中的字符相对位置确定,三个指针顺序遍历,如果str3中的当前字符是str1中字符,则++str3,++str1,如果是str2中的字符串,则++str2,++str3,如果有不相等或者遍历后str1,str2仍有字符则false.
namespace X{
void out(const char *str1, const char *str2, char *str3, int m, int n, int index)
{
if (!m && !n)
std::cout<<str3<<std::endl;
if (m) {
str3[index] = str1[0];
out(str1+1, str2, str3, m-1, n,index+1);
}
if (n) {
str3[index] = str2[0];
out(str1,str2+1, str3, m, n-1, index+1);
}
}
bool isstringsum (const char *str1, const char *str2, const char *str3) {
while (*str3) {
if(*str1==*str3) ++str1;
else if(*str2==*str3) ++str2;
else return false;
++str3;
}
if(*str1||*str2)
return false;
return true;
}
}
int main()
{
char *str1 = "ab";
char *str2 = "c";
int m = strlen(str1);
int n = strlen(str2);
char *strout= (char*) malloc((m+n+1)*sizeof(char));
strout[m+n] = '';
std::cout<<"result:"<<std::endl;
X::out (str1, str2, strout, m,n, 0);
char *str3 = "cab";
X::isstringsum(str1,str2,str3)?std::cout<<"ok"<<std::endl:std::cout<<"error"<<std::endl;
free(strout);
return 0;
}
Code On ideone