#include <iostream> #include <string> #include <cmath> #include <vector> #include <algorithm> using namespace std; using std::vector; void combiner_m(const char* , int , int ,vector<char> ,int ); void combiner(const char* ,int ); int main() { string s; int len = s.size(); //5個字符組合的最終結果數爲2^5-1 int count = pow(2, len); /* * 算法思想: * 1. n個字符組合的最終結果數爲2^n-1 * 2. 1-2^n-1中,每一個數的二進制表示組合的方式,其中1表示有字母,0表示沒有 * */ for(int i=1;i<count;i++){ string str; //尋找i中1的位置 for(int j=0;j<len;j++){ if((i>>j)&1){ str += s[j]; } } cout<<str<<endl; } const char* chs = s.c_str(); combiner(chs,len); return 0; } /****** * 採用遞歸方式進行字符串組合 * chs:字符串 * len:字符串長度 * ******/ void combiner(const char* chs,int len){ //對於一個字符串而言,能夠選擇要也能夠選擇不要 if(chs == NULL || *chs == '\0' ){ return; } for(int i=1;i<=len;i++){ vector<char> ch_vector; combiner_m(chs,0,i,ch_vector,len); } } void combiner_m(const char* chs, int begin, int len,vector<char> ch_vector,int size){ if(chs==NULL || *chs=='\0' || (begin>=size && len != 0)){ return; } if(len == 0){ for(vector<char>::iterator ite = ch_vector.begin();ite!=ch_vector.end();ite++){ cout<<*ite; } cout<<endl; return; } //包含begin處的元素 ch_vector.push_back(*(chs + begin)); combiner_m(chs,begin+1,len-1,ch_vector,size); //不包含begin的元素 vector<char>:: iterator index = find(ch_vector.begin(),ch_vector.end(),*(chs+begin)); ch_vector.erase(index); combiner_m(chs,begin+1,len,ch_vector,size); }