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

本文详细介绍了使用递归算法求解排列和组合的方法,包括组合生成的递归过程和排列生成的分治策略。通过实例代码展示了如何在C++中实现这一算法,并强调了递归截止条件的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <iterator>
#define num 6
void 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。

在求排列的代码中,采用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值