字母的全排列问题(python和C语言实现)

前言
这是一个经典的问题
设计一个算法,输出一个字符串字符的全排列问题。
比如:String=“abc”
输出是;abc,acb,bac,bca,cba,cab

解法
从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此进行递归处理。
比如:首先我要打印abc的全排列,就是第一步把a和b和c进行交换,得到bac,cba,这就需要一个for循环,循环里面有个swap,交换之后就相当于不管第一步了,进入到下一步递归,所以跟一个递归函数,完成递归之后把交换的换回来,变成原来的字串。

  • abc为例子:
    1. 固定a ,求后面bc的全排列:abc,acb。求完之后,a和b交换:得到bac,开始第二轮。
    1. 固定b,求后面ac的全排列:bac,bca。求完后,b和c交换:得到cab,开始第三轮。
    1. 固定c,求后面ba的全排列:cab,cba。
  • 递归树:
  • str: a b c
    ab ac ba bc ca cb
    result: abc acb bac bca cab cba 重点内容

大概情况如下
字母的全排列问题(python和C语言实现)_第1张图片

python语言实现

**In [151]: def perm(l):
     ...:     if len(l)<=1:
     ...:         return [l]
     ...:     r=[]
     ...:     for i in range(len(l)):
     ...:         s=l[:i]+l[i+1:]
     ...:         p=perm(s)
     ...:         for x in p:
     ...:             r.append(l[i:i+1]+x)
     ...:     return r
     ...:
In [152]: l=['a','b','c']
In [153]: perm(l)
Out[153]:
[['a', 'b', 'c'],
 ['a', 'c', 'b'],
 ['b', 'a', 'c'],
 ['b', 'c', 'a'],
 ['c', 'a', 'b'],
  • C语言实现
:void faction(Type a[],int p,int q)
{
    if(p==q)
    {
        for(int i=0;i<=q;i++)
            print("%d",a[i]);
    }

    else
    {
        int i;
        for(i=p;i<=q;i++)
        {
            swap(a,p,i);
            perm(a,p+1;q);
            swap(a,p,i);
        }
    }
}

参考:

你可能感兴趣的:(字母的全排列问题(python和C语言实现))