// language C with STL(C++)
// 剑指38
// https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
class Solution {
public:
vector<string> res;
char zimu[8];
int num[8];
int total=8;
int LEN;
int asize=0;
string a;
void beifen(char a[], int b[], int shu){
for(int i = 0; i<shu; i++){
a[i] = zimu[i];
b[i] = num[i];
}
}
void huigui(char a[], int b[], int shu){
for(int i = 0; i<shu; i++){
zimu[i] = a[i];
num[i] = b[i];
}
}
void display(){
for(int i =0; i<total; i++){
printf("%c-", zimu[i]);
}
printf("\n");
for(int i =0; i<total; i++){
printf("%d-", num[i]);
}
}
void zuo(int done){
if(done == LEN){
string b;
for(int j = 0; j< LEN; j++){
// printf("%c",a[j]);
b.push_back(a[j]);
}
// printf("\n");
// printf("%d",b.size());
res.push_back(b);
// printf("%d",res.size());
return;
}
char lin[total];
int shi[total];
beifen(lin,shi,total); // 是否用掉
for(int i =0; i<total; i++){
if(num[i]>0){
num[i]--;
a.push_back(zimu[i]);
zuo(done+1);
huigui(lin,shi,total);
a.pop_back();
}
}
}
vector<string> permutation(string s) {
LEN =s.length();
if(LEN ==0)
return res;
int next = 0;
bool flag = true;
for(int i = 0; i< LEN; i++){
flag = true;
for(int j = 0; j<next; j++){
if(zimu[j] == s[i]){
num[j]++;
flag = false;
break;
}
}
if(flag){
zimu[next] = s[i];
num[next] = 1;
next++;
}
}
// printf("%d-", LEN);
// printf("%d", next);
total = next;// 统计完毕,total 就是不同的字母的数量
// printf("%d-", total);
// display();
zuo(0);
return res;
}
};