题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串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; }