题目:
输入一个字符串,打印出该字符串中字符的所有排序。例如;输入字符串abc,输出由字符串'a'、'b'、'c'所能排列出来的所有字符串"abc","acb","bac","bca","cab","cba".
思路:
从字符串中选出一个字符为排头然后对后面字符做全排列。
步骤:
将a固定在第一位,求后面bc的排列
将b固定在第一位,求后面ac的排列
将c固定在第一位,求后面ab的排列
代码如下:
#include <iostream>
#include <string>
using namespace std;
void paixu(string prefix, string str)
{
if(str.length() == 0)
cout << prefix << endl;
else
{
for(int i = 0; i < str.length(); i++)
paixu(prefix+str[i], str.substr(0,i)+str.substr(i+1,str.length()));
}
}
void paixu(string s)
{
paixu("",s);
}
int main()
{
paixu("abc");
}
abc
acb
bac
bca
cba
cab
方法二:
思路:用下面的图片来描述再直观不过了
代码如下:
#include<stdio.h>
void allPermutation(char * perm ,int from ,int to);
void swap(char *perm ,int from ,int to);
main(){
char a[]={"aba"};
allPermutation(a ,0 ,2);
}
void allPermutation(char * perm ,int from ,int to){
if(to <= 1){
return;
}
if(from == to){
for(int i=0 ;i<=to ;i++){
printf("%c",perm[i]);
}
printf("\n");
}else{
for(int j= from ;j<=to ;j++){
if(perm[from] == perm[j] && j != from){
continue ;
}
swap(perm ,j,from);
allPermutation(perm ,from +1 ,to);
swap(perm,j,from);
}
}
}
void swap(char *perm ,int from ,int to){
char temp =0;
temp = perm[from];
perm[from] =perm[to];
perm[to] =temp;
}
运行结果:
aba
aab
baa
下面语句用来去除重复情况:
if(perm[from] == perm[j] && j != from){
continue ;
}
该方法理解起来并不是那么直观,可以试着一步一步跟踪观察值的变化。