OpenJudge | 全排列

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

描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’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成立。

样例输入

abc

样例输出

abc
acb
bac
bca
cab
cba

Code

#include <bits/stdc++.h>

using namespace std;

void f(array<char, 6> a, int n, int flag, int select, array<char, 6> res) {
  array<char, 6> b;
  if(flag == 0) {
    for(int i = 0; i < n; i++) cout << res[i];
    cout << endl;
    return;
  }
  for(int i = 0, j = 0; i <= flag; i++) if(i != select) b[j++] = a[i];
  for(int i = 0; i < flag; i++) {res[n-flag] = b[i]; f(b, n, flag-1, i, res);}
}

int main() {
  string st;
  cin >> st;
  array<char, 6> a, res;
  for(int i = 0; i < st.size(); i++) a[i] = st[i];
  for(int i = 0; i < st.size(); i++) {
    res[0] = a[i];
    f(a, st.size(), st.size()-1, i, res);
  }
}

测试用例

用例1

abc
输出
abc
acb
bac
bca
cab
cba

用例2

ab
输出
ab
ba

用例3

abcd
输出
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba

碎碎念

有时候,我感觉递归更像是美化后的n重循环

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mryan2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值