递归/stl两种实现方式详解

全排列

http://www.nowcoder.com/questionTerminal/5632c23d0d654aecbc9315d1720421c1

https://blog.csdn.net/csyifanZhang/article/details/105655354
↑为了更好地阅读体验

递归/stl两种实现方式详解

STL 全排列函数详解

头文件 #include <algorithm>


next_permutation:求下一个排列组合 

  • 函数模板:next_permutation(arr, arr+size);
  • 参数说明:
      arr: 数组名
      size:数组元素个数
  • 函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储
  • .注意:在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。比如,如果数组num初始化为2,3,1,那么输出就变为了:{2 3 1} {3 1 2} {3 2 1}

prev_permutation:求上一个排列组合

  • 函数模板:prev_permutation(arr, arr+size);
  • 参数说明:
      arr: 数组名
      size:数组元素个数
  • 函数功能: 返回值为bool类型,当当前序列不存在上一个排列时,函数返回false,否则返回true]
  • 注意:在使用前需要对欲排列数组按降序排序,否则只能找出该序列之后的全排列数。

对string类型:

string s;
while (getline(cin, s)) {
    sort(s.begin(), s.end());
    do
    {
        cout << s << endl;
    } while (next_permutation(s.begin(), s.end()));
    cout << endl;
}

对数组类型:

for (int i = 0; i < n; i++)cin >> a[i];
sort(a, a + n);
do
{
    for (int i = 0; i < n; i++)cout << a[i];
    cout << endl;
} while (next_permutation(a, a + n));
cout << endl;

递归求全排列

比如这里所说的全排列{"a","b","c","d"};

1。首先四个字母的全排列可以被简化成分别以"a"、"b"、"c"、"d"打头,加上剩下三个字母的全排列;

2。以此类推,上一步中的每一个三个字母的全排列,又可以被简化为分别以三个字母打头,加上剩下两个字母的全排列

3。重复前面的简化过程,直到只剩一个字母的时候,就很容易了处理了,因为一个字母的全排列太显而易见了

void pailie(string &str, int s, int t) {
    if (s == t) { cout << str << endl; return; }
    for (int i = s; i <= t; i++) {
        swap(str[s], str[i]);
        pailie(str, s + 1, t);//将str[s:t]的全排列转化为以s[i]开头 s[s+1:t]的全排列
        swap(str[s], str[i]);
    }
}
全部评论
要想这种方法按题目顺序输出,只能用map或则其他数据结构对结果进行排序
1 回复 分享
发布于 2020-07-21 12:34
求递归求全排列的完整通过代码
点赞 回复 分享
发布于 2020-04-27 01:12
感觉不太可,我补全代码,这种好像不能保证字母输出的顺序 #include<iostream> #include<string> #include<algorithm> /* 以abc为例 第一个数字 a b c 第二个数字 a b c 第三个数字 a b c */ using namespace std; string s; void swaps(char & x, char & y){ char tmp = x; x = y; y = tmp; } void Factorial(string str,int l, int r){ if(l == r){ cout << str << endl; return; } for(int i = l; i <= r; i++){ swaps(str[l],str[i]); Factorial(str,l+1,r); swaps(str[l],str[i]); } } int main(){ cin >> s; sort(s.begin(),s.end()); cout << s << endl; Factorial(s,0,s.size()-1); return 0; }</algorithm></string></iostream>
点赞 回复 分享
发布于 2020-07-21 12:30

相关推荐

2024-12-27 13:08
华南理工大学 Java
蝴蝶飞出了潜水钟丿:多看一眼就会💥
点赞 评论 收藏
分享
码农烧烤880:我靠2022了都去字节了还什么读研我教你****:你好,本人985电子科大在读研一,本科西南大学(211)我在字节跳动实习过。对您的岗位很感兴趣,希望获得一次投递机会。
点赞 评论 收藏
分享
从24年初开学开始接触到前端,和实验室几个同学一起学习,可似乎我总比他们慢一步,每每学完一个地方,我掌握的程度好像都不比他们,第一次实验室的任务实战,我两眼一抹黑,完全不知道从何下手,而他们却是游刃有余,可我当时没有丧气,只有一个念头,既然学习能力不如他们,那我就拿更多的时间去学,于是我把打游戏,运动锻炼的时间也拿来学习。到了暑假,实验室一起做项目,为了可以更好的参与进去,于是我暑假开始留校和同学师哥一起做项目,每天早上九点多去实验室,晚上十点多回宿舍,校田径队的训练没有去,中间也只回家待了一周。到暑假结束开学之后,一位很优秀的师哥拿到了几个offer,我从他身上看到了希望,双非本科就业的希望...
offer求求哩:我的评价是认知低,建议多看书,认知低的一个表现是人生仿佛没考上大学就是进厂,考上了就是考研考公找工作。股市里有一个很有意思的故事,说的是当门口大妈都在谈论股票的时候,说明行情已经见顶了。当你的父母在某些事上没有成功却支持你说明事情可能已经不可靠了,但在某些事上反对你,说明这件事可能还有成功的可能。(仅个人观点)😆😆
点赞 评论 收藏
分享
评论
12
1
分享

创作者周榜

更多
牛客网
牛客企业服务