[algorithm] 字符串判断包含关系和合并序列

本文探讨了如何判断一个字符串是否可以通过两个给定字符串按特定规则合并而成。通过递归方法列出所有可能的合并组合,并提出一种遍历检查的方法来验证目标字符串是否符合合并规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依然是德问上的一个问题:

首先两个字符串string1="ab"和字符串string2="c",他们的合并关系指输出所有的组合,这个例子应该输出:abc,acb,cab(每一个字符串的元素相对位置不变)。
给定了一个字符串string3="abc",怎么按照上面说的合并规则确定string3是不是string1和string2的一个合并关系呢?

问题分析:

假设两个字符串分别是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.

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

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] = ' \0 ';
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;
}

转载于:https://www.cnblogs.com/alex-tech/archive/2012/03/17/2403926.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值