您的位置:首页 > 职场人生

字符串的排列和组合实现(面试题 28)

2014-07-01 09:27 399 查看
1.字符串的排列(递归实现)

#include "iostream"
#include "string"
using namespace std;

static  int count =0;
void swap(char& a,char& b)
{
char c;
c =a;
a =b;
b =c;
}

void permulate(char* array,int first,int last)
{
char temp[20];
if (first ==last)
{
count++;
cout<<count<<":"<<array<<endl;
return;
}
for (int i=first;i<=last;i++)
{
swap(array[first],array[i]);
strcpy(temp,array);
permulate(temp,first+1,last);
}
}

void main()
{

char array[] ={"abcde"};
int len =strlen(array);
permulate(array,0,len-1);
}


2.字符串的组合(位运算实现,非常简单)

//输入一个字符串,输出所有字符的组合
#include "iostream"
using namespace std;

void combination(char* array,int num,int len)
{
for (int i=len-1;i>=0;i--)
{
if (num&(1<<i))
{
cout<<array[len -i-1];
}
}
cout<<endl;
}

void main()
{
char input[30];
cout<<"输入字符串:";
cin>>input;
int len =strlen(input);
for (int i=1;i<(1<<len);i++)
{
combination(input,i,len);
}
}


递归解决组合问题

#include <iostream>
#include <list>
using namespace std;
list<int> list1;
void find_factor(int sum,int n)
{
//递归出口
if(n<=0||sum<=0)
return;
//输出找到的数
if(sum==n)
{
list1.reverse();
for(list<int>::iterator iter=list1.begin();iter!=list1.end();iter++)
cout<<*iter<<"+";
cout<<n<<endl;
list1.reverse();
}
list1.push_front(n);
find_factor(sum-n,n-1);//n放在里面
list1.pop_front();
find_factor(sum,n-1);//n不放在里面
}

int main(void)
{
int sum,n;
cin>>sum>>n;
cout<<"所有可能的序列,如下:"<<endl;
find_factor(sum,n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排列 组合