字符全排列

题目描述:

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串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;
}


输出结果:

 

 

posted on 2012-09-20 15:43  as_  阅读(1126)  评论(0编辑  收藏  举报

导航