递归(一)003:全排列

21MINM 2023-01-25 18:07:56

003:全排列

总时间限制: 1000ms 内存限制: 65536kB

笔记地址:递归(一)003:全排列 - 21MINM - 博客园 (cnblogs.com)


描述


给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。


输入


输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。


输出


输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。


样例输入


highlighter- ebnf

abc

样例输出


 

abc
acb
bac
bca
cab
cba

解题思路
假设我们要对1,2,3,4四个数进行全排列,过程如下:
  (a)首先保持1不变,对2,3,4全排列;
  (b)保持2不变,对3,4全排列;
  (c)保持3不变,对4全排列,4的排列只有一种。得到1,2,3,4
  (d)然后3不能不变了,继续保持2不变,3,4互换得到1,2,4,3
  (e)以1,2打头的排列完成,接下来把3换到2的位置,继续(c)、(d)的操作
  ……
 得到

   1,3,4,2
   1,4,3,2
   1,4,2,3

因此得到以1打头的全部排序,以此类推,得到以2,3,4打头的排序,得到全排序。

将以上过程总结成一个递归算法:
  任取一个数打头,对后面n-1个数进行全排序,要求n-1个数的全排序,则要求n-2个数的全排序……直到要求的全排序只有一个数,找到出口。

解题代码:

#include <iostream>
#include <string>

using namespace std;
int n;

void swap(char &a, char &b) {
    char t = a;
    a = b;
    b = t;
}

void quanpailie(string s, int l, int r) {
    if (l == r) {
        cout << s << endl;
    } else {
        for (int i = l; i < r; i++) {
            swap(s[l], s[i]);
            quanpailie(s, l + 1, r);
        }
    }
}

int main() {
    string s;
    while (cin >> s) {
        quanpailie(s, 0, s.length());
    }
    return 0;
}

 

...全文
5 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
集宁师范学院

150

社区成员

社区管理员
  • c_university_364
  • 焚冉
加入社区
帖子事件
编辑了帖子 (查看)
2023-01-25 18:12
创建了帖子
2023-01-25 18:07
社区公告
暂无公告