递归/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-08 18:59
东北大学 Java
Java抽象带篮子:外卖项目可以看看我的详细的外卖话术,里面还写了怎么描述项目,还为了提高含金量额外增加了很多技术亮点呢。另外我这边还有个7000多字的轮子项目话术,可以狠狠的速成,需要的似我
点赞 评论 收藏
分享
评论
12
1
分享

创作者周榜

更多
牛客网
牛客企业服务