字符的所有组合

/*
求字符的所有组合
输入三个字符a,b,c,则它们的组合有a、b、c、ab、ac、bc、abc。当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。比如ab和ba是不同排列,但只算一个组合。我们可以把求n个字符串组成长度为m的组合的问题分解为两个子问题:
1。选择长度为n的字符串中的第一个字符,然后在剩下的n-1个字符中选择m-1个字符;
2。不选择长度为n的字符串中的第一个字符,然后在剩下的n-1个字符中选择m个字符。
*/


#include <iostream>


using namespace std;


void Combine( char *p, int m, int begin, char *p1 ,int begin1 )
{

if( m<=0 ) cout << p1 << endl; // 参数判断的顺序很重要!对传进来的每一个参数,务必检查!不要存在投机心理!!
else if( begin > (int)strlen(p)-1  );
else{
p1[begin1]= p[begin]; //用于暂存组合字符的p1的开始值也必须要专门设立一个变量begin1动态记录
Combine( p, m-1, begin+1, p1, begin1+1 );
Combine( p, m, begin+1, p1, begin1 );


}
}


void Combine( char *p )
{


if( p==NULL ) return ;
for( int i=1; i<=(int)strlen(p); i++ ) //输入n个字符,则这n个字符能构成长度为1,2,3 ,……,n的组合
{
char *p1=new char[i+1];//多预留一位放'\0',对字符串,千万记住最后一位加'\0'!!!
if(p1==NULL) return;
p1[i]='\0'; //在放数据前,提前在最后一位加'\0'把这个字符串空间包围起来
Combine( p, i, 0, p1, 0 );
delete [] p1;
}
}


int main( void )
{
char p[]="abc";
Combine( p );
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值