字符串的排列和组合代码 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
- 字符串的排列和组合代码 C++
- 字符串的排列和组合
- 字符串的排列和组合
- 字符串的排列和组合
- 字符串的全排列和全组合
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的排列输出 和组合输出
- [收集]字符串的全排列和组合
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 字符串的全排列和组合算法
- 【Linux】FrameBuffer操作入门
- Android核心基础-8.Android四大组件之Activity-2.关闭、传递数据
- Redis 5种数据类型,2种特殊数据处理策略
- light oj 1017 Brush (III)
- [经典书籍]编程经典书籍
- 字符串的排列和组合代码 C++
- [leetcode] Sudoku Solver
- 使用SpannableString设置部分文字大小、颜色、超链接、点击事件
- ubuntu中文手册安装
- POJ_3254_Corn Fields
- osgi2——camel网关调用其它系统webservice
- Number of 1 Bits
- IOS第四节:OC中的内存管理机制
- 详解计算机主机网关的作用