字符串組合

#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);


}
相關文章
相關標籤/搜索