前言
这是一个经典的问题
设计一个算法,输出一个字符串字符的全排列问题。
比如:String=“abc”
输出是;abc,acb,bac,bca,cba,cab
解法
从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此进行递归处理。
比如:首先我要打印abc的全排列,就是第一步把a和b和c进行交换,得到bac,cba,这就需要一个for循环,循环里面有个swap,交换之后就相当于不管第一步了,进入到下一步递归,所以跟一个递归函数,完成递归之后把交换的换回来,变成原来的字串。
- abc为例子:
-
- 固定a ,求后面bc的全排列:abc,acb。求完之后,a和b交换:得到bac,开始第二轮。
-
- 固定b,求后面ac的全排列:bac,bca。求完后,b和c交换:得到cab,开始第三轮。
-
- 固定c,求后面ba的全排列:cab,cba。
- 递归树:
- str: a b c
ab ac ba bc ca cb
result: abc acb bac bca cab cba 重点内容
大概情况如下
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);
}
}
}