给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = "1312",
输出为:
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
Input
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
Output
输出S所包含的字符组成的所有排列
Input示例
1312
Output示例
1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211
题意:= =、全排列。
个人理解:先用flag[10]数组把0-9的数的个数存储一下。然后用DFS选择每个位子选什么数,记得需要回溯。
更多的解释都在下面代码中。非常好理解
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int flag[10]; 6 int number1[15]; 7 void DFS(int number,int S)//(数组中有几个数,总共有几个数) 8 { 9 for (int i=0;i<10;i++) 10 { 11 if(flag[i]>0)//表示有这个数 12 { 13 flag[i]--;//消耗这个数 14 number1[number]=i;//把这个数放入数组 15 number++;//数组中有几个数 16 if(number==S)//数组中的数满了,表明已经选择完毕,则直接把数组中的数输出 17 { 18 for (int q=0;q<number;q++) 19 { 20 if(q!=number-1) 21 printf("%d",number1[q]); 22 else 23 printf("%d ",number1[q]); 24 } 25 } 26 DFS(number,S); 27 number--;//回溯 28 flag[i]++;//回溯 29 } 30 } 31 } 32 int main() 33 { 34 char s[10]; 35 scanf("%s",s); 36 memset(flag,0,sizeof(flag)); 37 int len=strlen(s); 38 for (int i=0;i<len;i++) 39 flag[s[i]-'0']++;//存储0-9每个数的个数 40 DFS(0,len); 41 return 0; 42 }