您的位置:首页 > 其它

字符串的组合问题 递归和非递归实现

2013-04-06 15:50 274 查看
求一个组合函数如p([1,2,3])输出:[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]

1、递归的方法:
每次选择和不选择这个字符,然后依次递归。

void Combination(char *str)
{
void Solution(char *, vector<char>&, int);
if(str == NULL)
return;
int n = strlen(str);
for(int i = 1; i <= n; ++i)//组合中含有几个字符
{
vector<char> Result;
Solution(str, Result, i);
}
}

void Solution(char *str, vector<char>&Result, int i)
{
if(*str == '\0' && i > 0)
return;
if(i == 0)
{
for(vector<char>::iterator iter = Result.begin(); iter != Result.end(); ++iter)
cout<<*iter;
cout<<endl;
return;
}
Result.push_back(*str);//这次组合中选择这个字符
Solution(str+1, Result, i-1);
Result.pop_back();//这次组合中不选择这个字符
Solution(str+1, Result, i);
}


1、 位图的思想
N个字符的组合共有2n-1种组合方式,设置一个变量i从1增长到2n-1,i的二进制表示每个byte位上为1,则输出字符串中对应的字符。
例如字符串为”123”,当i为1的时候二进制为001,最低位为1,则对应的组合是3,i为7的时候二进制位111,则对应的组合为123.
void Combination2(char *str)
{
int Length = strlen(str);
int n = 1<<Length;
for(int i = 1; i < n; ++i)
{
int j = 1 <<(Length -1);
int count = 0;
while(j >= 1)
{
if(i & j)//如果这位的数字是1,输出字符串中对应位的字符
cout<<*(str + Length -1 - count);
++count;
j >>= 1;
}
cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: