字符串的排列和组合代码 C++

来源:互联网 发布:黑九月 知乎 编辑:程序博客网 时间:2024/06/06 17:37

以下代码用于求一组字母的排列和组合,
思路:求组合时,采用递归的思路,当求数组的n个元素的组合时,首先将数组分为两部分,第一个元素和其余元素,当第一个元素在生成的组合中时,则在其余元素中求n-1的组合;当第一个元素不再生成的组合中时,则在其余元素中求n的组合。主函数用于调用上面描述的递归函数,用一个循环生成1到数组长度的所有组合,具体功能由子函数实现并打印出来。
求排列时:也是采用递归思路,把一个字符串看成由两部分组成:第一部分是它的第一个字符,第二部分是后面所有的字符。在求整个字符串的排列可以看成这两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符依次交换。然后再递归的求后面所有字符的排列。

#include <iterator>#define num 6void permutiation(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_begin,vector<char>::iterator vchar_iter_end){    if(vchar_iter_begin == vchar_iter_end){        ostream_iterator<char> outer(cout," ");        copy(vchar_iter,vchar_iter_end,outer);        cout << endl;    }    else{        vector<char>::iterator vchar_iter2 = vchar_iter_begin;        while(vchar_iter_begin != vchar_iter_end){            char temp = *vchar_iter_begin;            *vchar_iter_begin = *(vchar_iter2);            *vchar_iter2 =temp;            vchar_iter_begin++;            //vchar_iter ++;            permutiation(vchar_iter,vchar_iter2+1,vchar_iter_end);             temp = *(vchar_iter_begin -1);            *(vchar_iter_begin -1) = *(vchar_iter2);            *vchar_iter2 =temp;        }    }}static vector<char> result;void get_combination(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n);void get_combination (vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n,bool print){    for(int i = 0;i<n;i++){            //result.push_back(*vchar_iter);vchar_iter++;            get_combination(vchar_iter,vchar_iter_end,i+1);            //vchar_iter--;            //result.pop_back();            //get_combination(vchar_iter,vchar_iter_end,n-i);            //vchar_iter--;        //get_combination(vchar_iter++,vchar_iter_end,n-i,false);    }}void get_combination(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n){    if(vchar_iter==vchar_iter_end&&n!=0)        return;    if(n==0){        ostream_iterator<char> outer(cout," ");        copy(result.begin(),result.end(),outer);        cout << endl;        return;    }    /*if(n==vchar_iter_end-vchar_iter){        result.insert(result.end(),vchar_iter,vchar_iter_end);        ostream_iterator<char> outer(cout," ");        copy(result.begin(),result.end(),outer);        cout << endl;        return;    }*/    //for(int i = 0;i<n&&vchar_iter < vchar_iter_end;i++)    {            result.push_back(*vchar_iter);vchar_iter++;            get_combination(vchar_iter,vchar_iter_end,n-1);            //vchar_iter--;            result.pop_back();            get_combination(vchar_iter,vchar_iter_end,n);            //vchar_iter--;        //get_combination(vchar_iter++,vchar_iter_end,n-i,false);    }}int main(){    vector<char> vchar;    for(int i=0;i<num;i++){        vchar.push_back('a'+i);    }    //permutiation(vchar.begin(),vchar.begin(),vchar.end());    get_combination(vchar.begin(),vchar.end(),num,true);}

收获:在求组合的代码中,用到了两个函数,主函数用于调用子函数进而生成各种不同数目的组合,而子函数则完成生成特定数目的组合的生成和打印。这里注意递归截至条件的使用。在已经到达结尾,而仍旧不能产生有效的输出时直接return。

在求排列的代码中,采用

0 0