输入一个已经升序的字符数组,打印出该字符串数组中字符串的所有排列。例如:
input: ab cd
output: ab cd
cd ab
其实这个问题等同于例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba
解决这类问题最简单的方法就是采用递归函数:
如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以直接生成全排列。所以全排列的递归终止条件很明确,只有一个元素时。 基本的代码实现的框架如下所示:
void permute(char *a,int i,int n)
{
int j;
if (i == n)
printf("%s\n",a);
else
{
for (j = i; j <= n; j++)
{
if(a[i] == a[j] && j != i) //为避免生成重复排列,当不同位置的字符相同时不再交换
continue;
swap((a+i),(a+j));
permute(a,i+1,n);
swap((a+i),(a+j)); //backtrack
}
}
同时我们也可以采用迭代的方法来考虑这个问题。参考C++ 的 STL 库中自带了 next_permutation 来实现C语言的next_permutation:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int times = 0;
int next_permutation(