字符全排列
题目描述:
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
解析:
递归法:
- 首先看最后两个字符b, c。 它们的全排列为b c和c b, 即以b开头的c的全排列和以c开头的b的全排列。
- 再看三个字符a,b,c。他们的全排列(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,a,b)、(c,b,a)
从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
代码:(下面的输入以(a,b,c,d)为例)
#include <iostream> using namespace std; void swap(char *x, char *y) { int temp; temp = *x; *x = *y; *y = temp; } void perm(char *list, int i, int max) { if(i > max) { for(int j = 0; j <= max; j++) { cout << list[j] << " "; } cout << endl; } else { for(int j = i; j <= max; j++) { swap(&list[i], &list[j]); perm(list, i+1, max); swap(&list[i], &list[j]); } } } int main() { char list[4] = {'a', 'b', 'c', 'd'}; perm(list,0,3); return 0; }
输出结果: