您的位置:首页 > 其它

字符的所有组合

2014-06-20 11:43 106 查看
/*

求字符的所有组合

输入三个字符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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: