想看更多的解题报告:
http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:给出一个字符串,字符串不超过200位,问这个字符串的所有全排列,不过这个字符串里面是有重复的
解题思路:因为字符串是无序的,所以首先要把输入的字符串按小到大去排序,和经典全排列不同的是他有重复的字母,那么我们在递归的时候需要处理一下,就是本次递归的字母不用上次选的字母,根据一个这样的处理就可以避免重复的排列出现
#include <iostream> #include <algorithm> using namespace std; #define MAXV 210 int t,a[MAXV]; char s[MAXV],pr[MAXV]; void pl(int cap){ char c=0; int j; if(cap==t){ printf("%s\n",pr); return ; } for(j=0;j<t;j++){ if(!a[j] && c!=s[j]){ pr[cap]=c=s[j]; a[j]=1; pl(cap+1); a[j]=0; } } } int main(){ while(gets(s)){ memset(a,0,sizeof(a)); t=strlen(s); pr[t]='\0'; sort(s,s+strlen(s)); pl(0); } return 0; }