字符串组合

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


}
相关文章
相关标签/搜索