我们以三个字符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 permutation(char *pstr,char *pbegin) { if(!pstr||!pbegin)return; if(*pbegin=='\0')cout<<pstr<<endl; else { for(char *pch=pbegin;*pch!='\0';++pch) { char temp=*pch; *pch=*pbegin; *pbegin=temp; permutation(pstr,pbegin+1); temp = *pch; *pch = *pbegin; *pbegin = temp; } } } int main() { char pstr[10]; while(cin>>pstr) { permutation(pstr,pstr); } return 0; }