递归(一)003:全排列
003:全排列
总时间限制: 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
解题思路
假设我们要对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;
}
本文来自博客园,作者:21MINM,转载请注明原文链接:https://www.cnblogs.com/21MINM/p/17067104.html