题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
思路:以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
#include <iostream>
using namespace std;
//交换指针所指的元素
void swap(char *&p1,char *&p2){
char temp=*p1;
*p1=*p2;
*p2=temp;
}
//获取字符的排练组合
void getstrcount(char *str,char *beg)
{
if (str==nullptr||beg==nullptr)
{
return;
}
//递归结束,即输出此时的字符串
if (*beg=='\0')
{
for (int i=0;i<strlen(str);++i)
{
cout<<*(i+str);
}
cout<<endl;
}
else
{
//每次递归都是将倒数第3个字符不变,将字符串的最后2个字符的2种排列输出,然后交换倒数第3个字符与后2个字符
for (char *it=beg;*it!='\0';++it)
{
swap(it,beg);
getstrcount(str,beg+1);
swap(it,beg);
}
}
}
int main()
{
char test[5] = "abcd";
//char *beg=nullptr;
//beg=str;
getstrcount(test,test);
return 0;
}